<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body><div>AFAIK this behavior isn't actually documented anywhere, which means the fact that it works at all is surprising. I'm guessing it does this because null_resettable properties are modeled as IUOs, but the fact that it's not documented means I'm leery of relying on it.<br></div>
<div>&nbsp;</div>
<div>I'd much rather that this didn't work, but that there was some syntax to get access to the underlying storage of the lazy property so you can set it to nil. Or alternatively that lazy properties actually had an overloaded setter that accepted `nil` (or just a single setter that took an optional, but I'm not convinced that's a good idea), and then null_resettable could be translated directly into a lazy property. Though I still actually want access to the underlying storage because I want to be able to test if the lazy property is already initialized without having to make the initializer record that fact elsewhere.<br></div>
<div>&nbsp;</div>
<div>-Kevin Ballard</div>
<div>&nbsp;</div>
<div>On Fri, Dec 4, 2015, at 04:33 PM, Cameron Knight wrote:<br></div>
<blockquote type="cite"><div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="font" style="font-family:Helvetica"><span class="size" style="font-size:12px">Unless I'm missing something, this should give you the results you are looking for:</span></span><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">class</span> MyClass {<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">var</span> foreignKey: <span class="colour" style="color:rgb(112, 61, 170)">Int64</span>&nbsp;{<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(187, 44, 162);">&nbsp; &nbsp; &nbsp; &nbsp; didSet<span class="colour" style="color:rgb(0, 0, 0)"> {</span><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 129, 135);"><span class="colour" style="color:rgb(187, 44, 162)">self</span><span class="colour" style="color:rgb(0, 0, 0)">.</span>foreignObject<span class="colour" style="color:rgb(0, 0, 0)"> = </span><span class="colour" style="color:rgb(187, 44, 162)">nil</span><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp; &nbsp; &nbsp; &nbsp; }<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp; &nbsp; }<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp;</div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;"><span class="colour" style="color:rgb(187, 44, 162)">lazy</span> <span class="colour" style="color:rgb(187, 44, 162)">var</span> foreignObject: <span class="colour" style="color:rgb(79, 129, 135)">ForeignClass</span>! = {<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(79, 129, 135);"><span class="colour" style="color:rgb(187, 44, 162)">return</span><span class="colour" style="color:rgb(0, 0, 0)"></span>Database<span class="colour" style="color:rgb(0, 0, 0)">.</span><span class="colour" style="color:rgb(49, 89, 93)">expensiveSelect</span><span class="colour" style="color:rgb(0, 0, 0)">(</span><span class="colour" style="color:rgb(187, 44, 162)">self</span><span class="colour" style="color:rgb(0, 0, 0)">.</span>foreignKey<span class="colour" style="color:rgb(0, 0, 0)">)</span><br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">&nbsp; &nbsp; }()<br></div>
<div style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-size:11px;line-height:normal;font-family:Menlo;">}<br></div>
<div>&nbsp;</div>
<div>Using an Implicitly Unwrapped Optional instead of an Optional allows you to set&nbsp;<span class="font" style="font-family:Menlo"><span class="size" style="font-size:11px">foreignObject</span></span>&nbsp;to&nbsp;<span class="colour" style="color:rgb(187, 44, 162)"><span class="font" style="font-family:Menlo"><span class="size" style="font-size:11px">nil</span></span></span>&nbsp;which will give you the same behavior you use in Objective-C (a.k.a. null_resettable).<br></div>
<div>&nbsp;</div>
<div><pre style="white-space:pre-wrap;background-color:rgb(255, 255, 255);"><br></pre></div>
<blockquote type="cite"><div><pre style="white-space:pre-wrap;background-color:rgb(255, 255, 255);">To me this actually feels more like something that might fit better as an additional type of optional, rather than a language feature.

Setting this optional to nil could work normally, and any attempt to access the value when nil would cause the reload to occur. The initialization semantics might be a tad ugly though.

var myLazyOpt = ReloadingOptional&lt;ForeignClass&gt;({
return Database.expensiveSelect(self.foreignKey)
})

You could probably implement something like this yourself, though I'm not sure how elegant that would be without full language support.

Thanks for your time,
Cole Kurkowski
&gt;<i> On Dec 4, 2015, at 07:40, David Hart &lt;<a href="https://lists.swift.org/mailman/listinfo/swift-evolution">david at hartbit.com</a>&gt; wrote:
</i>&gt;<i></i>&gt;<i> In Objective-C, I often used the lazy initialization pattern to implement a cache for expensive operations. For exemple, here is an often used scenario in a project where objects behind foreign keys in a database ORM are only fetched when necessary:
</i>&gt;<i></i>&gt;<i> @interface MyClass : NSObject
</i>&gt;<i></i>&gt;<i> @property (nonatomic) ForeignClass* foreignObject;
</i>&gt;<i> @property (nonatomic) int64_t foreignKey;
</i>&gt;<i></i>&gt;<i> @end
</i>&gt;<i></i>&gt;<i> @implementation MyClass
</i>&gt;<i></i>&gt;<i> - (void)setForeignKey:(int64_t)foreignKey {
</i>&gt;<i>   _foreignKey = foreignKey;
</i>&gt;<i>   _foreignObject = nil;
</i>&gt;<i> }
</i>&gt;<i></i>&gt;<i> - (ForeignClass*)foreignObject {
</i>&gt;<i>   if (!_foreignObject) {
</i>&gt;<i>       _foreignObject = [Database expensiveSelect:_foreignKey];
</i>&gt;<i>   }
</i>&gt;<i>   return _foreignObject;
</i>&gt;<i> }
</i>&gt;<i></i>&gt;<i> @end
</i>&gt;<i></i>&gt;<i> Unfortunately, the lazy keyword in Swift, which was supposed to make the lazy initialization pattern more concsive does not work in this case:
</i>&gt;<i></i>&gt;<i> class MyClass {
</i>&gt;<i>   var foreignKey: Int64 {
</i>&gt;<i>       didSet {
</i>&gt;<i>           self.foreignObject = nil
</i>&gt;<i>       }
</i>&gt;<i>   }
</i>&gt;<i></i>&gt;<i>   lazy var foreignObject: ForeignClass? = {
</i>&gt;<i>       return Database.expensiveSelect(self.foreignKey)
</i>&gt;<i>   }()
</i>&gt;<i> }
</i>&gt;<i></i>&gt;<i> I'm forced to rewrite it this way:
</i>&gt;<i></i>&gt;<i> class MyClass {
</i>&gt;<i>   var foreignKey: Int64 {
</i>&gt;<i>       didSet {
</i>&gt;<i>           self.foreignObject = nil
</i>&gt;<i>       }
</i>&gt;<i>   }
</i>&gt;<i></i>&gt;<i>   private var _foreignObject: ForeignClass? = nil
</i>&gt;<i>   var foreignObject: ForeignClass? {
</i>&gt;<i>       if _foreignObject == nil {
</i>&gt;<i>           _foreignObject = Database.expensiveSelect(self.foreignKey)
</i>&gt;<i>       }
</i>&gt;<i>       return _foreignObject
</i>&gt;<i>   }
</i>&gt;<i> }
</i>&gt;<i></i>&gt;<i> When thinking about it, I came to the conclusion that the use cases of lazy seem very narrow compared to how useful the lazy initialization pattern was in Objective-C.
</i>&gt;<i> I want your opinion on three alternatives:
</i>&gt;<i></i>&gt;<i> 1- Do nothing, and use the slightly uglier Swift example when using a cache.
</i>&gt;<i> 2- Modify lazy semantics to re-calculates when nil (I think this is the worst solution).
</i>&gt;<i> 3- Add a cache modifier that re-calcualtes when nil.
</i>&gt;<i> _______________________________________________
</i>&gt;<i> swift-evolution mailing list
</i>&gt;<i><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">swift-evolution at swift.org</a></i>&gt;<i><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></i><br></pre></div>
</blockquote><div>&nbsp;</div>
<div><img style="height:1px !important;width:1px !important;border-top-width:0px !important;border-right-width:0px !important;border-bottom-width:0px !important;border-left-width:0px !important;margin-top:0px !important;margin-bottom:0px !important;margin-right:0px !important;margin-left:0px !important;padding-top:0px !important;padding-bottom:0px !important;padding-right:0px !important;padding-left:0px !important;" border="0" height="1" width="1" alt="" src="https://www.fastmailusercontent.com/proxy/52427f90968fae62a85174b652e16f35b283b1b771d15f4d22913bd1d1f4490d/8647470737a3f2f25723030323431303e23647e23756e64676279646e2e65647f27766f2f60756e6f35707e6d3148765176786c673171614a7d2236454230345272776e475655567a613943726750787372665b67326977384050577a7247745657314d2232465d22324a4167366d2232446c484262646d624a41347c6358584f62634a666472327f6b695178325f4e4276347b424366555f60373777394169645164514c484a623d64636b686549507d22324a7a66534239413e4a424a71494754595346405b4862646879417f453e614070517f6a414147727c624b61386d2232447c634e435973777656436567334454696679744a4b4d223241607e493a56633538545a6643485a4f4057756d22364c614d23344d23344/open"><br></div>
<div><u>_______________________________________________</u><br></div>
<div>swift-evolution mailing list<br></div>
<div><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br></div>
<div><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div>
</blockquote><div>&nbsp;</div>
</body>
</html>