首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么是“字符串?”不符合Equatable

为什么是“字符串?”不符合Equatable
EN

Stack Overflow用户
提问于 2018-02-24 02:10:08
回答 1查看 907关注 0票数 0

我创建了Observable类来实现Swift中的观察者模式。当值从旧值更改时,这将通知订阅者,因此此泛型类型应符合Equatable协议。但是当类型为String?时,Xcode会引发Type 'String?' does not conform to protocol 'Equatable'错误。

如果我没记错的话,StringString?符合Equatable protocol...why?

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-24 02:13:31

String?Optional<String>的缩写。在Swift 4.1之前,没有办法使类型有条件地符合协议。例如,仅当TEquatable时,Optional<T>才应为Equatable

这称为conditional conformance,在Swift 4.1中称为Optional: Equatable where Self.Wrapped: Equatable

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48953886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档