"self as?" 在协议扩展中
"self as?" within 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())
}
}
您可以尝试像下面这样扩展 DataSetEditable。
extension DataSetEditable where Self: SomeClass & SomeProtocol {
func add(_ data: Data) {
...
}
}
现在上面的扩展方法 func add(_ data: Data)
只能被 SomeClass
的子类访问并且跟随 SomeProtocol
。
首先,这可能是一个 Swift 错误,因为如果编译器无法处理它,它应该会提供一个错误。您应该在 bugs.swift.com. This feels related to SR-544.
打开它
也就是说,通常来说,要使 ObjC 类型符合 Swift-only 协议是非常棘手的。有时有效,有时无效。这是一个相当复杂的一致性,显然它并不总是有效。解决方案是通过添加 @objc
:
将协议公开给 ObjC
@objc protocol SomeProtocol: class {}
我正在尝试在协议扩展中强制转换 "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())
}
}
您可以尝试像下面这样扩展 DataSetEditable。
extension DataSetEditable where Self: SomeClass & SomeProtocol {
func add(_ data: Data) {
...
}
}
现在上面的扩展方法 func add(_ data: Data)
只能被 SomeClass
的子类访问并且跟随 SomeProtocol
。
首先,这可能是一个 Swift 错误,因为如果编译器无法处理它,它应该会提供一个错误。您应该在 bugs.swift.com. This feels related to SR-544.
打开它也就是说,通常来说,要使 ObjC 类型符合 Swift-only 协议是非常棘手的。有时有效,有时无效。这是一个相当复杂的一致性,显然它并不总是有效。解决方案是通过添加 @objc
:
@objc protocol SomeProtocol: class {}