Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 为什么;字符串;不符合Equalable_Swift - Fatal编程技术网

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