AnyObject数组的indexOf不能与字符串一起使用

时间:2015-10-05 16:46:35

标签: arrays swift swift2 indexof

所以我在playgroung中有以下代码

var array: [AnyObject] = ["", "2", "3"]

let index = array.indexOf("")

XCode正在标记编译器错误

Cannot convert value of type 'String' to expected argument type '@noescape (AnyObject) throws -> Bool'

所以我的问题是如何在AnyObjects的Array中获取indexOf元素?

4 个答案:

答案 0 :(得分:6)

如果你确定它会安全施放,你也可以施放到[String]

jvar array: [AnyObject] = ["", "2", "3"]
let index = (array as! [String]).indexOf("")

答案 1 :(得分:3)

试试这个

var array = ["", "2", "3"]
let index = array.indexOf("")

或者您可以使用NSArray方法:

var array: [AnyObject] = ["", "2", "3"]
let index = (array as NSArray).indexOfObject("")

答案 2 :(得分:0)

您永远不应将AnyObject用于任何类型的占位符,而是使用Any。原因:AnyObject仅适用于类,Swift使用了很多结构(Array,Int,String等)。您的代码实际上使用NSString而不是Swifts原生String类型,因为AnyObject想要一个类(NSString是一个类)。

答案 3 :(得分:0)

在更一般的情况下,当数组中的对象符合collectionType.indexOf协议时,Equatable将起作用。由于Swift String已符合Equatable,因此将AnyObject投射到String将删除错误。

如何在集合类型自定义类上使用indexOf? Swift 2.3

class Student{
   let studentId: Int
   let name: String
   init(studentId: Int, name: String){
     self.studentId = studentId
     self.name = name
   }
}

//notice you should implement this on a global scope
extension Student: Equatable{
}

func ==(lhs: Student, rhs: Student) -> Bool {
    return lhs.studentId == rhs.studentId //the indexOf will compare the elements based on this
}


func !=(lhs: Student, rhs: Student) -> Bool {
    return !(lhs == rhs)
}

现在你可以像这样使用它了

let john = Student(1, "John")
let kate = Student(2, "Kate")
let students: [Student] = [john, kate] 
print(students.indexOf(John)) //0
print(students.indexOf(Kate)) //1