"自我?"在协议扩展内

时间:2018-04-16 09:44:13

标签: swift casting protocol-extension

我正在尝试铸造" self"在协议扩展内。它在真实设备上运行时因EXC_BAD_ACCESS错误而崩溃但在模拟器上运行良好。我应该怎么做才能使这项工作?感谢

我的整个代码:

protocol SomeProtocol: class {

}

protocol DataSetEditable {
    func add(_ data: Data)
}

extension DataSetEditable where Self: SomeClass {
    func add(_ data: Data) {
        print(data)
        if let someProtocol = self as? SomeProtocol {
            print(someProtocol)
            //do some extra works
        }
    }
}

class SomeClass: UIView {

}

class MyClass: SomeClass, DataSetEditable, SomeProtocol {
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let myClass = MyClass()
        myClass.add(Data())
    }
}

2 个答案:

答案 0 :(得分:1)

您可以尝试扩展DataSetEditable,如下所示。

extension DataSetEditable where Self: SomeClass & SomeProtocol {
  func add(_ data: Data) {
   ...
  }
}

现在,上述扩展方法func add(_ data: Data)只能由SomeClass的子类访问,并且跟在SomeProtocol之后。

答案 1 :(得分:1)

首先,这可能是一个Swift错误,因为编译器应该提供错误,如果它无法处理它。你应该在bugs.swift.com打开它。这感觉与SR-544有关。

这就是说,通常将ObjC类型与Swift-only协议一致是非常棘手的。有时候它有效,有时则不然。这是一个非常复杂的一致性,显然它并不总是有效。解决方案是通过添加@objc

将协议公开给ObjC
@objc protocol SomeProtocol: class {}