以下操场代码在从1(Xcode 9.2,Swift 4)调用时导致第2行崩溃(EXC_BAD_ACCESS)。在我看来,这是完全有效的代码。
当删除Observable扩展并且在实现类中定义了addObserver方法(TestObservableImpl)时,崩溃消失。
如果删除协议TestObservableListener,并且TestObserverImpl在协议TestObservable中用作Observer的类型约束,则崩溃也会消失。
有没有人知道为什么,或者这只是一个Swift错误?
public protocol Observable: class {
associatedtype Observer: AnyObject
var observers: [Observer] { get set }
func addObserver(_ observer: Observer) -> Void
}
public extension Observable {
public func addObserver(_ observer: Observer) -> Void {
observers.append(observer)
}
}
protocol TestObservableListener: class {
func bla()
}
protocol TestObservable: Observable where Observer == TestObservableListener {
}
class TestObservableImpl: TestObservable {
typealias Observer = TestObservableListener
public var observers = [Observer]()
func broadcast() {
for observer in observers {
//2
observer.bla()
}
}
}
class TestObserverImpl: TestObservableListener {
func bla() {
print("bla")
}
}
let observable = TestObservableImpl()
let observer = TestObserverImpl()
observable.addObserver(observer)
//1
observable.broadcast()
答案 0 :(得分:1)
您是否曾尝试在AnyObject
后删除associatedtype Observer
:
public protocol Observable: class {
associatedtype Observer
var observers: [Observer] { get set }
func addObserver(_ observer: Observer) -> Void
}
我测试了它的工作。
我认为您的条件Observer == TestObservableListener
会在AnyObject
和Protocol
之间进行比较,导致出错。