[swift-evolution] [Review] SE-0030 Property Behaviors

Chris Lattner clattner at apple.com
Thu Feb 11 14:53:48 CST 2016

On Feb 11, 2016, at 10:30 AM, Joe Groff <jgroff at apple.com> wrote:
>> In any case, I think we should just pick a syntax, land the feature, and keep bikeshedding on it through the end of Swift 3 :-)
> Agreed.


>> I understand the need to specifying whether the getter/setter and other random methods are mutating or not, but doesn’t this eliminate the difference between a var/let behavior?  Couldn’t we just say that a behavior with a nonmutating getter & setter are valid on a “let”, and that any other mutating members are unavailable on a let?  This seems like a theoretical win, though I’m not sure whether it would actually be a win in practice for any conceivable behaviors you’ve been thinking about.
> I think we should subset 'let' behaviors out for the same reason we don't yet allow computed 'let' properties—right now 'let' guarantees immutability, and we don't have a way in the language to enforce that for user code. It would definitely be nice to be able to declare 'let [delayed]' and 'var [delayed]', though.

Ok, I’m fine with starting small and generalizing over time.

>> Of course, @initial_value_required is also pretty gross.  The alternative is to follow the precedent of operator decls, and introduce random syntax in their body, such as:
>> property behavior lazy<PropertyType> {
>>    initializer initValue
>>    var value: PropertyType? = nil   
>>>>        value = initValue
>>    ...
>> }
> Yeah, this is more like what I had proposed in previous drafts. If we go this route, I would rather use special contextual declarators like this than '@initial_value_required'-like attributes.

Agreed.  Where do you stand on taking behavior as a keyword?  Do you prefer something like the example above, or something like what you wrote in your proposal?

>> If a behavior has an init() with no arguments, then are the semantics that it is *always* run?  What if there are both an init() and an init(value : Value)?
> As proposed there is no 'init(value: Value)'; we can design that later. An 'init()' with no arguments would always run at initialization time, as if:
> var [behavior] x: Int
> instantiated storage like:
> var `x.[behavior].storage`: BehaviorStorage<Int> = `[behavior].init()`

Makes sense!

>> In "Resettable properties”, you have this:
>>   // Reset the property to its original initialized value.
>>   mutating func reset() {
>>     value = initialValue
>>   }
>> This raises the question of how “initialValue” works:  Is it evaluated once when the property is bound and the resultant value is stored somewhere (evaluating any side effects exactly once) or is it an auto-closure-like concept?  If it is autoclosure-like, what does it mean in terms of requiring “self." qualification & @noescape?
> In the proposal, I say it behaves like a get-only property—it evaluates every time it's loaded.

Ok, that semantic makes sense to me.  Given that, a behavior can emulate any of the other semantics it wants.

>> to work, where the behavior requires an initial value, but that value is provided by a flow-sensitive initialization point by DI .  How does this happen?
> Yeah. DI-like initialization is one of the future directions.

Ok.  That means that we can’t actually cut @NSCopying over to it yet, but I’m fine with tackling that later.

>> This makes me vaguely uncomfortable, given that “changeObserved” has undeclared type requirements that are only diagnosed when the behavior is instantiated.
> That was an oversight. In reality you'd have to declare:
> public behavior var [changeObserved] _: Value = initialValue
>   where Value: Equatable {

Ok, great.

I’m very curious where you stand on the syntax of the behavior decl, because this decl (as one concrete example) seems like it would be *much* nicer as:

public var behavior changeObserved<Value : Equatable> {

>> Can property requirements in protocols have behaviors on them?
> I think not.

Ok, please mention that, thanks!

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160211/9b5402d5/attachment.html>

More information about the swift-evolution mailing list