<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">After considering this further, I think the answer is simpler and more in line with design goals.</div><div class=""><br class=""></div><div class="">Proposal:</div><div class="">• Support set-only real or computed properties limited by access level.</div><div class="">• To achieve this, add&nbsp;<b class="">private(get)</b>&nbsp;/&nbsp;<b class="">internal(get) </b>since we already support private/internal(set)</div><div class="">• Make get computed property optional (with set)</div><div class=""><br class=""></div><div class="">This would support patterns where client code can set data on file/module based structures, allowing that data to be read within the file/module structure. This supports information hiding where the client should only push data and allow modules to respond to that. Other parts of the code should not be reading this data and making assumptions. It should be hidden.</div><div class=""><br class=""></div><div class="">One example design pattern is the Builder pattern. The client could set various properties, and the builder would aggregate these and return a configured object.</div><div class=""><br class=""></div><div class="">This also provides a cleaner style of setting and more consistent style of setting, <font face="Courier" class=""><b class="">foo.prop = bar</b></font>, rather than using function syntax, <font face="Courier" class=""><b class="">foo.setProp(bar)</b>,</font>&nbsp;for this use case (where we want set-only), while using dot syntax for other use cases (where we want get and set).</div><div class=""><br class=""></div><div class="">Examples:</div><div class=""><br class=""></div><div class=""><font face="Courier" class=""><b class="">private(get) var foo:Foo</b></font></div><div class=""><br class=""></div><div class="">With computed setter,</div><div class=""><br class=""></div><div class=""><font face="Courier" class=""><b class="">private(get) var foo:Foo {</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; get {</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; &nbsp; &nbsp; return self.foo</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; }</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; set {</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; &nbsp; &nbsp; self.foo = newValue</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; &nbsp; &nbsp; self.bar = Bar(foo: self.foo) // e.g. Builder pattern</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; }</b></font></div><div class=""><font face="Courier" class=""><b class="">}</b></font></div><div class=""><br class=""></div><div class="">or just make the computed getter optional,</div><div class=""><br class=""></div><div class=""><div class=""><font face="Courier" class=""><b class="">private(get) var foo:Foo {</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; set {</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; &nbsp; &nbsp; self.foo = newValue</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; &nbsp; &nbsp; self.bar = Bar(foo: self.foo)</b></font></div><div class=""><font face="Courier" class=""><b class="">&nbsp; &nbsp; }</b></font></div><div class=""><font face="Courier" class=""><b class="">}</b></font></div></div><div class=""><br class=""></div><div class="">Is there a compelling argument not to support this? (aside from, "why bother, you can use a function setter")</div><div class=""><br class=""></div><div class="">David</div><div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">On Jan 7, 2016, at 8:50 PM, Wallacy &lt;<a href="mailto:wallacyf@gmail.com" class="">wallacyf@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class="">"The downside of using a method is it’s just not as convenient/elegant to use than simple assignment."<div class=""><br class=""></div><div class="">"pure setter" is also pretty confusing. I can set but not read the value again?</div><div class=""><br class=""></div><div class="">If you want a "simpler" setter, you can define a closure or unlabeled func.<br class=""></div><div class=""><br class=""></div><div class="">&nbsp; class iClass{</div><div class="">&nbsp; &nbsp; let myProperty:(String)-&gt;() = { value in</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; print("1: \(value)");<br class=""></div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func myProperty(value: String)-&gt;() {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; print("2: \(value)");<br class=""></div><div class="">&nbsp; &nbsp; }</div><div class="">&nbsp; &nbsp; func otherProperty(value: String)-&gt;() {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; print("3: \(value)");<br class=""></div><div class="">&nbsp; &nbsp; }</div><div class="">}</div><div class=""><br class=""></div><div class="">iClass().myProperty("a");</div><div class="">//iClass().myProperty(value: "b"); // How to call the function in this case?</div><div class="">iClass().otherProperty("c");</div><div class=""><br class=""></div><div class="">It's more clear than:<br class=""></div><div class=""><br class=""></div><div class="">iClass().myProperty == "a";<br class=""></div><div class=""><div class="">iClass().otherProperty&nbsp;== "c";<br class=""></div></div><div class=""><br class=""></div><div class="">FWIW:</div><div class=""><br class=""></div><div class="">func "myProperty(value: String)-&gt;()" seems to be hidden by closure "myProperty:(String)-&gt;()".<br class=""></div><div class=""><br class=""><div class="gmail_quote"><div dir="ltr" class="">Em qui, 7 de jan de 2016 às 15:32, David James via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; escreveu:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">Perhaps “pure setters” is a misnomer. Probably more accurate would be to call it a “computed setter”?<div class=""><br class=""></div><div class="">To your point about properties being for lookup, understandable. That’s why I suggested introducing the “set” keyword instead of using var .. set.<br class=""><div class=""><br class=""></div><div class="">The downside of using a method is it’s just not as convenient/elegant to use than simple assignment.</div><div class=""><br class=""></div><div class="">David</div></div></div><div style="word-wrap:break-word" class=""><div class=""><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Jan 7, 2016, at 6:16 PM, Félix Cloutier &lt;<a href="mailto:felixcca@yahoo.ca" target="_blank" class="">felixcca@yahoo.ca</a>&gt; wrote:</div><br class=""><div class=""><div style="word-wrap:break-word" class="">.NET has them and I never felt that I needed them. For me, a property implies something that can be looked up.<div class=""><br class=""></div><div class="">What's the downside of using a method?<br class=""><div class=""><div class="">
<br class=""><span style="font-family:'Lucida Grande';font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important" class="">Félix</span>
</div>

<br class=""><div class=""><blockquote type="cite" class=""><div class="">Le 7 janv. 2016 à 10:47:20, David James via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; a écrit :</div><br class=""><div class=""><div style="word-wrap:break-word" class="">Currently Swift has computed properties that support get or get and set, but not set only. There are use cases where we would want set only.&nbsp;<div class=""><br class=""></div><div class="">For example, toggling a boolean which changes another stored property where it would be overkill to make a method for that. It's more intuitive to just assign a boolean. e.g. myObject.myBoolean = true</div><div class=""><br class=""></div><div class="">Another example, setting an object that is introspected in order to create a new object which is then stored on a different property. The property that is stored could be readonly/get, for example. A method for the setter (e.g. setSomething) would not be as intuitive as just a plain assignment (e.g. myObject.something = ..).&nbsp;</div><div class=""><br class=""></div><div class="">Another consideration is that a pure setter would support better information hiding. You may not want the parent object to expose the property. Example scenario: set a property on an object (via assignment), which creates/modifies a stored property based on the passed (set) value, and then pass the parent object to another part of the system which can than read the stored property but <u class="">not</u> the original set property — i.e. you may not want to expose the original set property to another part of the system.</div><div class=""><br class=""></div><div class="">Example:</div><div class=""><br class=""></div><div class=""><div class="">var myProperty:MyClass {</div><div class="">&nbsp; &nbsp; set {</div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; …</div><div class="">&nbsp; &nbsp; }</div><div class="">}<br class=""></div></div><div class=""><br class=""></div><div class="">One concern is that without ‘get’ there really is no property at all, and perhaps this is the reason that pure setter was never included. However, this does not invalidate the above.</div><div class=""><br class=""></div><div class=""><div class="">As an alternative (to make it more semantically sensible) we could introduce a new keyword ‘set’, so:</div><div class=""><br class=""></div><div class=""><div class="">set myProperty:MyClass {</div><div class="">&nbsp; &nbsp; ...</div><div class="">}<br class=""></div></div><div class=""><br class=""></div><div class="">Which would support simple assignment:</div><div class=""><br class=""></div><div class="">myObject.myProperty = myOtherObject</div><div class=""><br class=""></div><div class="">Finally, it’s important to know that this is still “computed", but only computed on the input, not on the output side.</div><div class=""><div class=""><br class=""></div><div class=""><div class=""><div style="font-family:Verdana;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word" class=""><div style="font-family:Verdana;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;word-wrap:break-word" class=""><span style="border-collapse:separate;line-height:normal;border-spacing:0px" class=""><div style="word-wrap:break-word" class=""><span style="border-collapse:separate;font-family:Verdana;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;border-spacing:0px" class=""><div style="word-wrap:break-word" class=""><span style="border-collapse:separate;font-family:Verdana;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;border-spacing:0px" class=""><div style="word-wrap:break-word" class=""><div class="">David James</div></div></span></div></span></div></span></div></div>
</div>
<br class=""></div></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=iRI3beHTe3UxYAHTlV3lA38zIPfHMhyuRzgTmGKV6k7A8T-2Fx8ViL3eYcSVNlVzpVBJ2-2BbX07eRSACehou4SS7Y-2FrOfczCeaNiYLmz2H76yFyR3pUPUM8FzAP9XNIFJvcmY1GqITEXc1irvWvoNq3fYIxtglD-2FvDZP7NlFUbWToILQYqAf8RDWENdFVOdVuYuRDgHp56fSy68gjSKCl-2Bpdz6jlPkInLpEf-2BMn0CmNc3o-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important" class="">
</div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""><div class="">
<div style="font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; word-wrap: break-word;" class=""><div style="font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; word-wrap: break-word;" class=""><span style="border-collapse: separate; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px;" class=""><div style="word-wrap:break-word" class=""><span style="border-collapse: separate; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px;" class=""><div style="word-wrap:break-word" class=""><span style="border-collapse: separate; font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; border-spacing: 0px;" class=""><div style="word-wrap:break-word" class=""><div class="">David James</div></div></span></div></span></div></span></div></div>
</div>
<br class=""></div></div></div><div style="word-wrap:break-word" class=""><div class=""></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=fuWmDRE6-2FDdvdUHeLHruUfdigJaxz7nh99l6HfkulY-2F68faHjY-2FW6wMLCskIyc1EyT4xRFFwbIn6wSBI9Pd7lurMY6ayPKiRg-2BRE6DsUZSeqlmhEYscCSru5FXcQBqSanFExmlEGRmk6GFfdZPRD36xNNA0XR5sO2ym4tc94c-2F5KvwSPNEVYIXfF4RO3dYaCoyegnoN0gC5-2Fv4PniVFrMGKojPbCEfDYL8BDDusFypo-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important" class="">
</div>
_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
</blockquote></div></div></div>
</div></blockquote></div><br class=""><div class="">
<div style="color: rgb(0, 0, 0); font-family: Verdana;  font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="color: rgb(0, 0, 0); font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span class="Apple-style-span" style="border-collapse: separate; line-height: normal; border-spacing: 0px;"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-stroke-width: 0px;"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Verdana; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; border-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-stroke-width: 0px;"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">David James</div></div></span></div></span></div></span></div></div>
</div>
<br class=""></div></body></html>