我尝试使用泛型方法来查找数组中项目的索引
public extension Array where Element: AnyObject {
func findIdxOf<T: AnyObject>(_ item: T) -> Int? {
return self.firstIndex{ $0 === item }
}
}
用法:
struct FeedData: Codable {
...
}
var currentFeedsArr: [FeedData] = []
var feed = FeedData()
let idx: Int? = currentFeedsArr.findIdxOf(feed)
我得到的错误-
Instance method 'findIdxOf' requires that 'FeedData' be a class type
Referencing instance method 'findIdxOf' on 'Array' requires that 'FeedData' be a class type
如何解决?
它非常简单。你说
where Element: AnyObject
这意味着:;元素必须是一个类"这正是AnyObject的意思。(使用===
意味着您知道这一点,因为只有一个类可以与身份运算符===
一起使用。(
因此,findIdxOf
仅适用于元素为类的数组。但是FeedData不是一个类。它是一个结构。
因此,当您尝试将findIdxOf
应用于FeedData数组时,编译器会抱怨。
除此之外,还不清楚您创建此泛型的目的是什么。如果目标是将firstIndex(of:)
与FeedData一起使用,那么放弃findIdxOf
,简单地将FeedData声明为Equatable。如果目标确实是实现firstIndex(of:)
的一个特殊版本,该版本比较类实例的标识,那么就将FeedData声明为一个类。