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”. Jordan > On Aug 2, 2016, at 17:01, Rick Mann via swift-users <swift-users@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 <daveswee...@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@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 >>> rm...@latencyzero.com >>> >>> >>> _______________________________________________ >>> swift-users mailing list >>> swift-users@swift.org >>> https://lists.swift.org/mailman/listinfo/swift-users >> > > > -- > Rick Mann > rm...@latencyzero.com <mailto:rm...@latencyzero.com> > > > _______________________________________________ > swift-users mailing list > swift-users@swift.org <mailto:swift-users@swift.org> > https://lists.swift.org/mailman/listinfo/swift-users > <https://lists.swift.org/mailman/listinfo/swift-users>
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users