我创建了Observable类来实现Swift中的观察者模式。当值从旧值更改时,这将通知订阅者,因此此泛型类型应符合Equatable协议。但是当类型为String?时,Xcode会引发Type 'String?' does not conform to protocol 'Equatable'错误。
如果我没记错的话,String和String?符合Equatable protocol...why?
import UIKit
final class Observable<T: Equatable> {
typealias ObserverHandler = ((T) -> Void)
typealias ObserverEntry = (owner: AnyObject, didChange: ObserverHandler)
var value: T {
didSet {
if self.value == oldValue { return }
self.observers.forEach({ (entry: ObserverEntry) in entry.didChange(self.value) })
}
}
private var observers: [ObserverEntry] = []
init(_ value: T) {
self.value = value
}
func subscribe(observer: AnyObject, didChange block: @escaping ObserverHandler) {
let entry: ObserverEntry = (owner: observer, didChange: block)
observers.append(entry)
}
func unsubscribe(observer: AnyObject) {
let filteredEntries: [ObserverEntry] = observers.filter({ (entry: ObserverEntry) -> Bool in
return (entry.owner !== observer)
})
self.observers = filteredEntries
}
}
// [!] Type 'String?' does not conform to protocol 'Equatable'
var foo: Observable<String?> = Observable(nil)发布于 2018-02-24 02:13:31
String?是Optional<String>的缩写。在Swift 4.1之前,没有办法使类型有条件地符合协议。例如,仅当T为Equatable时,Optional<T>才应为Equatable。
这称为conditional conformance,在Swift 4.1中称为Optional: Equatable where Self.Wrapped: Equatable。
https://stackoverflow.com/questions/48953886
复制相似问题