> On Aug 2, 2016, at 19:06 , Jordan Rose <[email protected]> wrote:
>
> I don’t think it makes sense to do this. A protocol cannot control how a
> particular property is implemented (stored or computed), and any conforming
> type must initialize all of its stored properties before returning from its
> own initializer. (You can’t write an initializer in a protocol that doesn’t
> delegate to another initializer because you don’t know what other stored
> properties the conforming type might have.)
>
> Given that the protocol can’t control how the property gets initialized, it
> doesn’t make sense to allow the protocol to "set the variable, but only in
> the initializer”.
Really? It seems pretty natural for a conforming type to set a property once in
the initializer, and it's immutable from then on out. I can do that quite
cleanly with classes, but there's no way (that I know) to describe this using
protocols. Ideally, I could just do:
protocol
Element
{
let uuid: UUID
}
which implies that all conforming types must initialize that value on creation,
or provide a getter with let semantics (the latter might be too easy to break,
and could be disallowed, requiring conforming types to create storage for the
property and set it in init()).
>
> Jordan
>
>
>> On Aug 2, 2016, at 17:01, Rick Mann via swift-users <[email protected]>
>> wrote:
>>
>> It complains if I make it a let because computed properties must be var.
>> Because it's a protocol, it can't be stored (even though it can be stored in
>> the conforming type).
>>
>> If I make it { get }, I can't set it in the extensions init() method.
>>
>> I guess I could make it private set (not sure of the syntax for that), but
>> it still doesn't have let semantics.
>>
>>> On Aug 2, 2016, at 16:28 , David Sweeris <[email protected]> wrote:
>>>
>>> If I understand things correctly, you *can* make uuid a let because you’re
>>> allowed to set them (once) during init functions.
>>>
>>> - Dave Sweeris
>>>
>>>> On Aug 2, 2016, at 6:22 PM, Rick Mann via swift-users
>>>> <[email protected]> wrote:
>>>>
>>>> I'm trying to define a protocol that has a read-only, immutable member
>>>> "uuid" that can be set in the init() method, but I'm having trouble. I
>>>> have this:
>>>>
>>>> protocol
>>>> Element
>>>> {
>>>> var uuid : { get }
>>>> }
>>>>
>>>> extension
>>>> Element
>>>> {
>>>> init(...)
>>>> {
>>>> self.uuid = ...
>>>> }
>>>> }
>>>>
>>>> I can't make it let, because they're computed.
>>>>
>>>> I'm realizing from other stuff that I really can't have the init(...)
>>>> method in the extension, anyway. But I'd really like to be able to specify
>>>> a let member in the protocol. What's the best way to have that effect?
>>>>
>>>> In my semantics, an Element has a uniquely-assigned uuid. It might be
>>>> generated when the object is instantiated, or it might be deserialized
>>>> from disk, but once that's done, it can never change. How do I express
>>>> that?
>>>>
>>>> Thanks,
>>>>
>>>> --
>>>> Rick Mann
>>>> [email protected]
>>>>
>>>>
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> [email protected]
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>
>>
>>
>> --
>> Rick Mann
>> [email protected]
>>
>>
>> _______________________________________________
>> swift-users mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-users
>
--
Rick Mann
[email protected]
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users