我试图构建一个扩展,将NSArray / NSMutableArray的一些便利功能添加到Swift Array类中,我试图添加此功能:
func indexOfObject(object:AnyObject) -> Int? {
if self.count > 0 {
for (idx, objectToCompare) in enumerate(self) {
if object == objectToCompare {
return idx
}
}
}
return nil
}
但不幸的是,这一行:
if object == objectToCompare {
给出错误:
无法找到' =='接受提供的参数
导致此错误的错误是什么?
extension Array {
func indexOfObject(object:AnyObject) -> Int? {
if self.count > 0 {
for (idx, objectToCompare) in enumerate(self) {
if object == objectToCompare {
return idx
}
}
}
return nil
}
}
答案 0 :(得分:7)
实际上没有必要实施indexOfObject:
;已经有一个全局函数find(array, element)
。
答案 1 :(得分:6)
您始终可以创建使用NSArray的indexOfObject的扩展名,例如:
extension Array {
func indexOfObject(object:AnyObject) -> Int? {
return (self as NSArray).indexOfObject(object)
}
}
您可以指定可以将数组项与<T : Equatable>
约束进行比较,然后将对象转换为T
并进行比较,例如:
extension Array {
func indexOfObject<T : Equatable>(o:T) -> Int? {
if self.count > 0 {
for (idx, objectToCompare) in enumerate(self) {
let to = objectToCompare as T
if o == to {
return idx
}
}
}
return nil
}
}
答案 2 :(得分:2)
我的猜测是你必须做这样的事情:
func indexOfObject<T: Equatable>(object: T) -> Int? {
等等。
答案 3 :(得分:0)
以下是Apple&#34; The Swift Programming Language&#34;的相关示例。在&#34;泛型&#34;部分:
func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {
for (index, value) in enumerate(array) {
if value == valueToFind {
return index
}
}
return nil
}
这里的关键想法是,value
和valueToFind
必须属于保证实现/重载==
运算符的类型。 <T: Equatable>
是一个泛型,它只允许类型的对象很好,等同。
在您的情况下,我们需要确保数组本身仅由等同的对象组成。 Array
被声明为具有通用<T>
的结构,但不要求它是等同的。我不知道是否可以使用扩展来更改数组可以组成的类型。我已经尝试了一些语法变化,但没有找到方法。
答案 4 :(得分:0)
您可以将比较部分提取到另一个辅助函数,例如
extension Array {
func indexOfObject(object: T, equal: (T, T) -> Bool) -> Int? {
if self.count > 0 {
for (idx, objectToCompare) in enumerate(self) {
if equal(object, objectToCompare) {
return idx
}
}
}
return nil
}
}
let arr = [1, 2, 3]
arr.indexOfObject(3, ==) // which returns {Some 2}
答案 5 :(得分:0)
你很亲密。这是一个有效的扩展:
extension Array {
func indexOfObject<T: Equatable>(object:T) -> Int? {
if self.count > 0 {
for (idx, objectToCompare) in enumerate(self) {
if object == objectToCompare as T {
return idx
}
}
}
return nil
}
}
Swift无法知道 object 或 objectToCompare 是否相等。通过向方法添加通用信息,我们就可以开展业务了。