我编写了一个协议(在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()
这是运行时错误:
但是当我将委托代码更改为:
protocol Delegate{
var titleImage:UIImage? {get}
}
没关系!!!但是它不能限制Delegate再次符合Root类了!
谁能告诉我为什么会这样?将“Self:Root”添加到Delegate时为什么会触发BAD_ACCESS运行时错误?
这是Swift中的Bug还是我误解了什么?
非常感谢 ;)
在声明协议时添加@objc
@objc protocol Delegate where Self: Root{
var titleImage: UIImage? {get}
}
这是一个当前的bug在swift所以包装在@objc
应该工作