任何对象数组的indexOf在处理字符串时无法正常工作

4

所以我在一个playground中有以下代码:

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

let index = array.indexOf("")

XCode提示编译错误:

无法将类型为'String'的值转换为预期参数类型'@noescape (AnyObject) throws -> Bool'

我的问题是,如何在包含任意对象的数组中获取元素的indexOf?


为什么不使用[String],很少使用AnyObject,特别是在Swift中! 你应该始终指定你的数组中包含的内容! - AaoIi
AnyObject 是一个占位符,表示“未指定”。该数组显然是一个字符串数组,因此只需删除注释 [AnyObject]。编译器会推断出正确的类型。 - vadian
如果数组是在Objective-C类中定义的NSArray呢? - Black Sheep
4个回答

6
如果您确信可以安全地进行转换,也可以将其转换为[String]。
jvar array: [AnyObject] = ["", "2", "3"]
let index = (array as! [String]).indexOf("")

3

试试这个

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

或者您可以使用NSArray方法:

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

0

永远不要使用AnyObject作为任何类型的占位符,而应该使用Any。原因是:AnyObject只能用于类,而Swift使用了很多结构体(如Array、Int、String等)。实际上,您的代码使用了NSString而不是Swift的本地String类型,因为AnyObject需要一个类(NSString是一个类)。


我同意你的观点,我只是用了一种简单的方式来说明我的问题,即在某个Objective-C类中定义了一个NSArray,并在Swift类中进行访问。 - Black Sheep

0
在更一般的情况下,当数组中的对象符合Equatable协议时,collectionType.indexOf将起作用。由于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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接