我正在尝试铸造" 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())
}
}
答案 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 protocol SomeProtocol: class {}