<div><br><div class="gmail_quote"><div>On Fri, Jun 23, 2017 at 17:19 David Moore 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">



<div>
<div name="messageBodySection" style="font-size:14px;font-family:-apple-system,BlinkMacSystemFont,sans-serif">I think there might be some merit to this pitch, since you brought up a particular weak spot. I’d have to see what other people say about this, but it would seem that having the ability to explicitly mark something as constant for a given protocol implementation. 
<div><br></div>
<div>However, I would propose a change to the syntax you gave as an example, since it isn’t quite clear when it comes to the implementation. I think just a simple `let foo: Bar` would suffice, unless I’m missing some particular component of your concept.</div>
<div><br></div>
<div>This would allow extensions to operate on known constant values,</div></div></div></blockquote><div><br></div><div>The way to express such a requirement is `var x { get }`. By contrast, what Robert is asking for is a property that can be set exactly once specifically during initialization.</div><div><br></div><div>For his proposed idea to work, `let x = 42` must in fact *not* satisfy the requirement that Robert spells `var x { let }`, since the initializer could not then set the value one more time. However, as I demonstrated in my previous email, his idea also cannot work because initializers can be chained (and, in protocol extension implementations, *must* be chained), and the implementation of the chainer may be opaque to the chainee or vice versa. Therefore, neither the compiler nor the author can guarantee that the property is set once and not more or less.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div name="messageBodySection" style="font-size:14px;font-family:-apple-system,BlinkMacSystemFont,sans-serif"><div> perhaps improving performance maybe.</div>
</div></div><div>
<div name="messageReplySection" style="font-size:14px;font-family:-apple-system,BlinkMacSystemFont,sans-serif"><br>
On Jun 23, 2017, 5:49 PM -0400, Robert Bennett via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;, wrote:<br>
<blockquote type="cite" style="margin:5px 5px;padding-left:10px;border-left:thin solid #1abc9c">Hello Swift Evolution,<br>
<br>
I’m bumping into an annoying problem with protocols. In a class or struct it is common to have a `let` instance variable and assign it in `init`. Unfortunately there is no way to translate this into a protocol with init in an extension. If attempting to set the variable in init in an extension, it must be of type { get set }, which means it cannot be a `let` constant in the conforming type. AFAIK there is no way around this — if you want to set an instance variable in an initializer in a protocol extension, it must be marked as { get set }. The alternative is to write the initializer separately for each adopting type, but this violates DRY.<br>
<br>
Hence, I am proposing a third option to go along with `get` and `set` in a protocol. This would indicate that the variable can be a constant, but is settable in an initializer. In this case, the conforming type *must* use `let` to declare the variable.<br>
<br>
Option 1: the keyword `let`. If present, it would need to be the only thing in the curly brackets because it simultaneously implies `get` and not `set`.<br>
<br>
protocol P {<br>
var x: Int { let }<br>
init(_ x: Int)<br>
func modifyX()<br>
}<br>
extension P {<br>
init(_ x: Int) {<br>
self.x = x // This is ok; would not be ok if x were marked { get }<br>
}<br>
<br>
func modifyX() {<br>
self.x += 1 // Not allowed<br>
}<br>
}<br>
<br>
struct S: P {<br>
let x: Int // This is ok; would not be ok if x were marked { get set }<br>
}<br>
<br>
Option 2: `set(init)`. Can (and often will) coexist with `get`.<br>
<br>
protocol P {<br>
var x: Int { get set(init) }<br>
init(_ x: Int)<br>
func modifyX()<br>
}<br>
extension P {<br>
init(_ x: Int) {<br>
self.x = x // This is ok; would not be ok if x were marked { get }<br>
}<br>
<br>
func modifyX() {<br>
self.x += 1 // Not allowed<br>
}<br>
}<br>
<br>
struct S: P {<br>
let x: Int // This is ok; would not be ok if x were marked { get set }<br>
}<br>
<br>
<br>
I’d like to hear all of your thoughts on this.<br>
<br>
Best,<br>
Robert<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></blockquote>
</div>
</div>

_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div></div>