【发布时间】:2020-09-14 02:22:11
【问题描述】:
我为元素为对象的数组做了一个扩展,所以我可以通过它们的地址来比较它们。
public extension Array where Element: AnyObject {
func hasExactSameItem(_ searchingItem: Element) -> Bool {
guard let _ = indexOfExactSameItem(searchingItem) else { return false }
return true
}
func indexOfExactSameItem(_ searchingItem: Element) -> Int? {
for (index, item) in self.enumerated() {
if searchingItem === item {
return index
}
}
return nil
}
}
还有一个符合 AnyObject 协议的协议
public protocol IMServerListener: AnyObject {
}
我有一个包含 IMServerListener 的数组
private var listeners = [IMServerListener]()
当我开始向该数组添加侦听器时,编译器抱怨“[IMServerListener]”要求“IMServerListener”符合“AnyObject”
func addListener(_ listener: IMServerListener) {
listeners.hasExactSameItem(listener)
}
我以为 IMServerListener 符合 AnyObject 协议,为什么会这样?
【问题讨论】:
-
这本质上是this 的另一个版本。协议只是不符合其他协议。请改用受约束的泛型类型。
<T: IMServerListener>和listener: T. -
与您的问题无关,但在您的第一种方法中,为什么不简单地返回
indexOfExactSameItem(searchingItem) != nil?在您的第二种方法中,您可以简单地返回firstIndex { $0 === searchingItem }