Swift EXC_BAD_ACCESS,在协议扩展中定义了默认实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift EXC_BAD_ACCESS,在协议扩展中定义了默认实现相关的知识,希望对你有一定的参考价值。
从1(Xcode 9.2,Swift 4)调用时,以下操场代码会导致第2行崩溃(EXC_BAD_ACCESS)。在我看来,这是完全有效的代码。
删除Observable扩展并且在实现类中定义addObserver方法(TestObservableImpl)时崩溃消失。
如果删除了协议TestObservableListener,则崩溃也会消失,而TestObserverImpl将用作协议TestObservable中Observer的类型约束。
有没有人知道为什么,或者这只是一个Swift bug?
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()
您是否尝试过像AnyObject
之后删除associatedtype Observer
:
public protocol Observable: class {
associatedtype Observer
var observers: [Observer] { get set }
func addObserver(_ observer: Observer) -> Void
}
我测试了它的工作。
我认为你的条件Observer == TestObservableListener
将比较AnyObject
和Protocol
导致该错误。
以上是关于Swift EXC_BAD_ACCESS,在协议扩展中定义了默认实现的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS
尝试在 Swift 中初始化 UIActionSheet 时出现 EXC_BAD_ACCESS
在 Swift 中使用泛型、协议和继承创建对象时的 EXC_BAD_ACCESS
线程 1:EXC_BAD_ACCESS (code=1, address=0x0) 在 swift 中工作时尝试登录到 spotify
Swift:带有@escaping 闭包的选择器返回 EXC_BAD_ACCESS
UIButton 在 Swift 中抛出 Thread1: EXC_BAD_ACCESS (code=1, address 0x...)