带有where子句的协议在强制转换后访问属性时崩溃

时间:2019-02-28 09:45:58

标签: ios swift swift-protocols swift4.2

将对象投射到协议(由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
}

我尝试了不同的事情。

  1. 删除where Self: UIViewController子句,崩溃消失了。
  2. 如果不强制转换访问对象,则不会崩溃。效果很好

    let vc = MyViewController(); print(vc.id)

  3. 如果将协议标记为“仅类”,则可以正常工作,并且不会崩溃,但是会出现警告

      

    呼出约束'Self':'AnyObject'

enter image description here

0 个答案:

没有答案