[swift-users] Protocol with instance var that's set on construction, otherwise read-only

Rick Mann rmann at latencyzero.com
Wed Aug 3 03:51:25 CDT 2016


> On Aug 2, 2016, at 19:06 , Jordan Rose <jordan_rose at apple.com> 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 <swift-users at swift.org> 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 <davesweeris at mac.com> 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 <swift-users at swift.org> 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
>>>> rmann at latencyzero.com
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> 
>> 
>> 
>> -- 
>> Rick Mann
>> rmann at latencyzero.com
>> 
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
> 


-- 
Rick Mann
rmann at latencyzero.com




More information about the swift-users mailing list