我试图通过搜索列表找到一个项目索引。有人知道怎么做吗?
我看到有一张单子。StartIndex和list。EndIndex,但我想要类似python的list.index("text")。
我试图通过搜索列表找到一个项目索引。有人知道怎么做吗?
我看到有一张单子。StartIndex和list。EndIndex,但我想要类似python的list.index("text")。
当前回答
在Swift 4中,可以使用firstIndex方法。使用==相等操作符根据id在数组中查找对象的示例:
let index = array.firstIndex{ $0.id == object.id }
注意,这个解决方案避免了您的代码需要符合公平协议,因为我们比较的是属性而不是整个对象
另外,关于== vs ===的注意事项,因为到目前为止发布的许多答案在用法上有所不同:
==是相等运算符。它检查值是否相等。 ===是恒等运算符。它检查一个类的两个实例是否指向同一个内存。这与相等不同,因为使用相同值独立创建的两个对象使用==被认为是相等的,而不是===,因为它们是不同的对象。(源)
从Swift的文档中阅读更多关于这些运营商的信息是值得的。
其他回答
在Swift 4.2中
.index(where:)被更改为.firstIndex(where:)
array.firstIndex(where: {$0 == "person1"})
在Swift 4/5中,使用“firstIndex”查找索引。
let index = array.firstIndex{$0 == value}
只需使用firstIndex方法。
array.firstIndex(where: { $0 == searchedItem })
tl; diana:
对于课程,你可能会寻找:
let index = someArray.firstIndex{$0 === someObject}
完整的回答:
我认为值得一提的是,对于引用类型(类),你可能想要执行一个标识比较,在这种情况下,你只需要在谓词闭包中使用===标识操作符:
Swift 5、Swift 4.2:
let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")
let people = [person1, person2, person3]
let indexOfPerson1 = people.firstIndex{$0 === person1} // 0
let indexOfPerson2 = people.firstIndex{$0 === person2} // 1
let indexOfPerson3 = people.firstIndex{$0 === person3} // 2
let indexOfPerson4 = people.firstIndex{$0 === person4} // nil
注意,上面的语法使用了尾随闭包语法,等价于:
let indexOfPerson1 = people.firstIndex(where: {$0 === person1})
Swift 4 / Swift 3 -该函数过去被称为index
Swift 2 -该函数过去被称为indexOf
*请注意paulbailey关于实现Equatable的类类型的相关和有用的评论,其中您需要考虑是否应该使用===(标识操作符)或==(相等操作符)进行比较。如果您决定使用==进行匹配,那么您可以简单地使用其他人(人们)建议的方法。firstIndex (: person1))。
斯威夫特5
func firstIndex(of element: Element) -> Int?
var alphabets = ["A", "B", "E", "D"]
例二
let index = alphabets.firstIndex(where: {$0 == "A"})
Example2
if let i = alphabets.firstIndex(of: "E") {
alphabets[i] = "C" // i is the index
}
print(alphabets)
// Prints "["A", "B", "C", "D"]"