Swift 为什么;字符串;不符合Equalable
我创建了Swift 为什么;字符串;不符合Equalable,swift,Swift,我创建了observatable类来实现Swift中的observator模式。当值从旧值更改时,将通知订阅者,因此此泛型类型应符合Equalable协议。 但是当一个类型是String?时,Xcode会提升 类型“String”不符合协议“equalable”错误 如果我没记错的话,String和String?符合均衡协议……为什么 import UIKit final class Observable<T: Equatable> { typealias ObserverHa
observatable
类来实现Swift中的observator模式。当值从旧值更改时,将通知订阅者,因此此泛型类型应符合Equalable协议。
但是当一个类型是String?
时,Xcode会提升 <代码>类型“String”不符合协议“equalable”错误
如果我没记错的话,String
和String?
符合均衡协议……为什么
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)
导入UIKit
最终类可观测{
typealias ObserverHandler=((T)->Void)
typealias ObserverEntry=(所有者:AnyObject,didChange:ObserverHandler)
var值:T{
迪塞特{
如果self.value==oldValue{return}
self.observators.forEach({(entry:obserentry)在entry.didChange(self.value)中)
}
}
私有var观察员:[ObserverEntry]=[]
初始值(u值:T){
自我价值=价值
}
func subscribe(观察者:AnyObject,didChange块:@escaping ObserverHandler){
let条目:ObserverEntry=(所有者:observer,didChange:block)
附加(条目)
}
func取消订阅(观察者:AnyObject){
让FilterDentries:[ObserverEntry]=observer.filter({(条目:ObserverEntry)->Bool-in
返回(entry.owner!==观察者)
})
self.observators=filteredentry
}
}
//[!]类型“字符串”不符合协议“Equalable”
变量foo:可观察=可观察(无)
字符串?
是可选的缩写。在Swift 4.1之前,无法使类型有条件地符合协议。例如,可选
应为可均衡
仅当T
为可均衡
时
这称为a,在Swift 4.1中,可选:equalable where Self.Wrapped:equalable
字符串?
是可选的缩写。在Swift 4.1之前,无法使类型有条件地符合协议。例如,可选
应为可均衡
仅当T
为可均衡
时
这称为a,在Swift 4.1中,可选:equalable where Self.Wrapped:equalable
您是否尝试过使用键值观察?您可以在以下链接中获得有关KVO的更多信息:Swift 4.1更新:现在你试过用键值来代替吗?您可以在以下链接中获得有关KVO的更多信息:Swift 4.1更新:现在D