0

我试图在协议扩展中投射“自我”。它在真实设备上运行时因 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())
    }
}
4

2 回答 2

1

您可以尝试像下面那样扩展 DataSetEditable。

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

现在上面的扩展方法 func add(_ data: Data)只有SomeClassand的子类可以访问SomeProtocol

于 2018-04-16T16:45:38.167 回答
1

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

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

@objc protocol SomeProtocol: class {}
于 2018-04-16T17:04:46.877 回答