Swift EXC_BAD_ACCESS,在协议扩展中定义了默认实现

时间:2017-12-20 07:41:47

标签: swift crash swift4

以下操场代码在从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()

1 个答案:

答案 0 :(得分:1)

您是否曾尝试在AnyObject后删除associatedtype Observer

public protocol Observable: class {
  associatedtype Observer
  var observers: [Observer] { get set }
  func addObserver(_ observer: Observer) -> Void
}

我测试了它的工作。

我认为您的条件Observer == TestObservableListener会在AnyObjectProtocol之间进行比较,导致出错。