将对象投射到协议(由where子句定义)并访问导致崩溃EXC_BAD_ACCESS
的属性。
在Swift Playground中崩溃的示例代码。
protocol ProtocolA where Self: UIViewController {
var id: Int { get set}
}
class MyViewController: UIViewController, ProtocolA {
var id = 10
}
let vc:UIViewController = MyViewController()
if let protocolA = vc as? ProtocolA {
print(protocolA.id) // Crash here EXC_BAD_ACCESS
}
我尝试了不同的事情。
where Self: UIViewController
子句,崩溃消失了。如果不强制转换访问对象,则不会崩溃。效果很好
let vc = MyViewController();
print(vc.id)
如果将协议标记为“仅类”,则可以正常工作,并且不会崩溃,但是会出现警告
呼出约束'Self':'AnyObject'