这是Swift编译器中的错误吗?

问题描述 投票:3回答:1

我编写了一个协议(在Xcode playground中),并希望它符合指定的类,例如:Root。

因为我使用了Swift 4.1,所以有新的语法:

protocol Delegate where Self:Root{
    var titleImage:UIImage? {get}
}

(PS:如果您想了解更多相关信息,请点击链接:How to make Swift protocol conformed by a specific kind of Class?

我还写了Root和Foo类:

class Root:Delegate{
    var titleImage:UIImage?

    func willDo(){
        let foo = Foo()
        foo.delegate = self
        foo.invoke()
    }
}

class Foo{
    var delegate:Delegate!

    func invoke(){
        if let image = delegate.titleImage{
            print("have a image [\(image)")
        }else{
            print("not have a image")
        }
    }
}

问题是,当我打电话时:

let r = Root()
r.willDo()

这是运行时错误:

enter image description here

但是当我将委托代码更改为:

protocol Delegate{
    var titleImage:UIImage? {get}
}

没关系!!!但是它不能限制Delegate再次符合Root类了!

谁能告诉我为什么会这样?将“Self:Root”添加到Delegate时为什么会触发BAD_ACCESS运行时错误?

这是Swift中的Bug还是我误解了什么?

非常感谢 ;)

ios swift protocols
1个回答
2
投票

在声明协议时添加@objc

@objc protocol Delegate where Self: Root{
    var titleImage: UIImage? {get}
}

这是一个当前的bug在swift所以包装在@objc应该工作

© www.soinside.com 2019 - 2024. All rights reserved.