我试图通过搜索列表找到一个项目索引。有人知道怎么做吗?
我看到有一张单子。StartIndex和list。EndIndex,但我想要类似python的list.index("text")。
我试图通过搜索列表找到一个项目索引。有人知道怎么做吗?
我看到有一张单子。StartIndex和list。EndIndex,但我想要类似python的list.index("text")。
当前回答
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))。
其他回答
你可以用闭包来过滤数组:
var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 } // <= returns [3]
你可以对数组进行计数:
filtered.count // <= returns 1
所以你可以通过组合这些来确定数组是否包含你的元素:
myList.filter { $0 == 3 }.count > 0 // <= returns true if the array includes 3
如果你想找这个职位,我不认为有什么花哨的方法,但你可以这样做:
var found: Int? // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
if x[i] == 3 {
found = i
}
}
EDIT
当我们这样做的时候,为了一个有趣的练习,让我们扩展Array来有一个find方法:
extension Array {
func find(includedElement: T -> Bool) -> Int? {
for (idx, element) in enumerate(self) {
if includedElement(element) {
return idx
}
}
return nil
}
}
现在我们可以这样做:
myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found
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))。
在Swift 4.2中
.index(where:)被更改为.firstIndex(where:)
array.firstIndex(where: {$0 == "person1"})
这些方法对我都适用
这是我对Swift 4的解决方案:
let monday = Day(name: "M")
let tuesday = Day(name: "T")
let friday = Day(name: "F")
let days = [monday, tuesday, friday]
let index = days.index(where: {
//important to test with === to be sure it's the same object reference
$0 === tuesday
})
只需使用firstIndex方法。
array.firstIndex(where: { $0 == searchedItem })