<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">I agree that partial classes would be a handy way to help split up an implementation, and perhaps also of assistance if you want really tight/clean access control within a class, using <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">fileprivate</code>. But this does not replace the need for stored properties in extensions.</p>
<p style="margin:0px 0px 1.2em!important">For example (I have done this in Obj-C) if you want to add drag+drop functionality to <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">UIView</code> in such a way that all its subclasses automatically support it. You could add the functions and the state, such as <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">isDraggable</code> and <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">dragFromParent</code> and <code style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">isDropTarget</code> etc. Note this is just an example of a use-case, extending a class from an external library.</p>
<p style="margin:0px 0px 1.2em!important">The implementation previously discussed would use a side-allocation table pointed at from the refcount portion of the object header and the flag set to indicate the refcounts were moved inside the table (the same table would also be needed for instances with weak refs anyway). Thus only instances that actually made use of the extension stored-properties would bear the cost of additional storage.</p>
<div title="MDH:SSBhZ3JlZSB0aGF0IHBhcnRpYWwgY2xhc3NlcyB3b3VsZCBiZSBhIGhhbmR5IHdheSB0byBoZWxw
IHNwbGl0IHVwIGFuIGltcGxlbWVudGF0aW9uLCBhbmQgcGVyaGFwcyBhbHNvIG9mIGFzc2lzdGFu
Y2UgaWYgeW91IHdhbnQgcmVhbGx5IHRpZ2h0L2NsZWFuIGFjY2VzcyBjb250cm9sIHdpdGhpbiBh
IGNsYXNzLCB1c2luZyBgZmlsZXByaXZhdGVgLiBCdXQgdGhpcyBkb2VzIG5vdCByZXBsYWNlIHRo
ZSBuZWVkIGZvciBzdG9yZWQgcHJvcGVydGllcyBpbiBleHRlbnNpb25zLjxicj48YnI+Rm9yIGV4
YW1wbGUgKEkgaGF2ZSBkb25lIHRoaXMgaW4gT2JqLUMpIGlmIHlvdSB3YW50IHRvIGFkZCBkcmFn
K2Ryb3AgZnVuY3Rpb25hbGl0eSB0byBgVUlWaWV3YCBpbiBzdWNoIGEgd2F5IHRoYXQgYWxsIGl0
cyBzdWJjbGFzc2VzIGF1dG9tYXRpY2FsbHkgc3VwcG9ydCBpdC4gWW91IGNvdWxkIGFkZCB0aGUg
ZnVuY3Rpb25zIGFuZCB0aGUgc3RhdGUsIHN1Y2ggYXMgYGlzRHJhZ2dhYmxlYCBhbmQgYGRyYWdG
cm9tUGFyZW50YCBhbmQgYGlzRHJvcFRhcmdldGAgZXRjLiBOb3RlIHRoaXMgaXMganVzdCBhbiBl
eGFtcGxlIG9mIGEgdXNlLWNhc2UsIGV4dGVuZGluZyBhIGNsYXNzIGZyb20gYW4gZXh0ZXJuYWwg
bGlicmFyeS48YnI+PGJyPlRoZSBpbXBsZW1lbnRhdGlvbiBwcmV2aW91c2x5IGRpc2N1c3NlZCB3
b3VsZCB1c2UgYSBzaWRlLWFsbG9jYXRpb24gdGFibGUgcG9pbnRlZCBhdCBmcm9tIHRoZSByZWZj
b3VudCBwb3J0aW9uIG9mIHRoZSBvYmplY3QgaGVhZGVyIGFuZCB0aGUgZmxhZyBzZXQgdG8gaW5k
aWNhdGUgdGhlIHJlZmNvdW50cyB3ZXJlIG1vdmVkIGluc2lkZSB0aGUgdGFibGUgKHRoZSBzYW1l
IHRhYmxlIHdvdWxkIGFsc28gYmUgbmVlZGVkIGZvciBpbnN0YW5jZXMgd2l0aCB3ZWFrIHJlZnMg
YW55d2F5KS4gVGh1cyBvbmx5IGluc3RhbmNlcyB0aGF0IGFjdHVhbGx5IG1hZGUgdXNlIG9mIHRo
ZSBleHRlbnNpb24gc3RvcmVkLXByb3BlcnRpZXMgd291bGQgYmVhciB0aGUgY29zdCBvZiBhZGRp
dGlvbmFsIHN0b3JhZ2UuPGJyPg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, 10 Dec 2016 at 21:48 Andrey Volodin via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">There is a lot of talk about stored properties in extensions. But do we really need them?<br class="gmail_msg">
<br class="gmail_msg">
Instead I think we can introduce something like partial classes from C#. It is an often case our classes go hell of a big and we have to move some methods to dedicated extensions to increase readability. It is also an often case that those methods have some stored properties they work with. This is often leads to a pattern where we have all stored properties declared in Class.swift and then we implement extensions in Class+Something.swift files.<br class="gmail_msg">
<br class="gmail_msg">
I bet partial classes should only be available within one module, so you can’t extend class from library, etc and work close to text-wide level, just to ease the code navigation. That is also will allow some code generation tricks, making it easy to create UI/Level designers for Swift. (for example you can generate some methods and properties of a Scene class in an editor and mix-in that in the user’s project.)<br class="gmail_msg">
<br class="gmail_msg">
Any thoughts?<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div>