在"数组"上引用实例方法"findIdxOf"要求"FeedData"是类类型



我尝试使用泛型方法来查找数组中项目的索引

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声明为一个类。

最新更新