Like I mentioned, it is necessary to use optional, but it can not be nil.  
Consider the following example where I have to use an optional in order to 
break retention cycle:

protocol Container : class {
    var component: Component { get }
}

class ConcreteContainer : Container {
    var component: Component! = nil
    init() {
        component = Component(container: self)
    }
}

class Component {
    unowned let container: Container
    init(container: Container) {
        self.container = container
    }
}

Playground execution failed: error: scratchpad.playground:5:7: error: type 
'ConcreteContainer' does not conform to protocol 'Container'
class ConcreteContainer : Container {
      ^

scratchpad.playground:2:9: note: protocol requires property 'component' with 
type 'Component'; do you want to add a stub?
    var component: Component { get }
        ^

scratchpad.playground:6:9: note: candidate has non-matching type 'Component!'
    var component: Component! = nil
        ^

Cheers,
Anton

P.S. Declaring protocol as

protocol Container : class {
    var component: Component! { get }
}

.. would also work of course, but my question is not about how to move forward, 
rather about whether such setup is deliberate.


> On 29 May 2017, at 08:20, Zhao Xin <owe...@gmail.com> wrote:
> 
> Why you have to use `unwrapped optional` at the first place? If you have to 
> use it, it means it could be nil. So it won't conform the protocol, which 
> requires the `value` never nil.
> 
> Zhaoxin
> 
> On Mon, May 29, 2017 at 12:37 PM, Anton Bronnikov via swift-users 
> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
> Hi All,
> 
> If I have a protocol with a property requirement such as:
> 
> protocol Foo {
>     var value: Int { get }
> }
> 
> .. and I need to conform to it using an implicitly unwrapped optional like:
> 
> struct Bar : Foo {
>     let value: Int! = nil
> }
> 
> .. then the compiler fails with an error:
> 
> Playground execution failed: error: scratchpad.playground:5:8: error: type 
> 'Bar' does not conform to protocol 'Foo'
> struct Bar : Foo {
>        ^
> 
> scratchpad.playground:2:9: note: protocol requires property 'value' with type 
> 'Int'; do you want to add a stub?
>     var value: Int { get }
>         ^
> 
> scratchpad.playground:6:9: note: candidate has non-matching type 'Int!'
>     let value: Int! = nil
>         ^
> Technically, I understand why the error, and currently work around it with a 
> cumbersome:
> 
> struct Bar : Foo {
>     var value: Int { return _value! }
>     let _value: Int? = nil
> }
> 
> However, I keep wondering - would it not be making sense to accept implicitly 
> unwrapped optionals as a conformance to be base-type requirements?  It sort 
> of works just like that in all other parts of the language.
> 
> Or in other words, is this by design, or should I probably create an issue 
> for this?
> 
> Thank you.
> Cheers,
> Anton
> 
> P.S. The example is oversimplified for the sake of clarity, in practice the 
> property just has to be an optional - implicitly unwrapped or not - because 
> it’s a part of the composite that holds unowning reference to its container 
> object.
> 
> 
> _______________________________________________
> 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

Reply via email to