<div dir="ltr">From <a href="https://swift.org/about/" target="_blank">https://swift.org/about/</a>: &quot;The most obvious way to write code should also behave in a safe manner.&quot;<div><br></div><div>To this end I think that closures should capture references types weakly by default. Pretty much the only way I know of to (easily) create memory issues with pure swift is to capture a strong reference in a closure.</div><div><br></div><div>I think with consideration when designing asynchronous APIs this could be quite painless.</div><div><br></div><div>Cases weak may be excluded:</div><div> * If the closure is @noescape<br></div><div> * If the object&#39;s lifetime is provably limited to the block</div><div> * If it&#39;s a value type</div><div><br></div><div>I think the upsides by far outweigh the downsides.</div><div><br></div><div>Upside:</div><div> * no more surprises</div><div> * safer code</div><div><br></div><div>Downsides:</div><div> * You may sometimes have to use optional chaining or similar to resolve a weak reference.</div><div> * Beginners need to understand optionals, but they&#39;re likely to do so before learning blocks.</div><div> * There&#39;s probably a few edge cases I haven&#39;t explored, and a few more here:<br></div><div><br></div><div>class Test {</div><div>   func doSomething(v: Int) { ... }</div><div>   func async(callback: Int-&gt;Void) {</div><div>      doWork { value in</div><div>           callback?(value)</div><div>      }</div><div>   }</div><div>}</div><div><br></div><div>self.test = Test()</div><div>self.test.async(test.doSomething) // what is the lifetime of test.doSomething?</div><div><br></div></div>