我试图通过搜索列表找到一个项目索引。有人知道怎么做吗?
我看到有一张单子。StartIndex和list。EndIndex,但我想要类似python的list.index("text")。
我试图通过搜索列表找到一个项目索引。有人知道怎么做吗?
我看到有一张单子。StartIndex和list。EndIndex,但我想要类似python的list.index("text")。
当前回答
斯威夫特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"]"
其他回答
您还可以使用函数库Dollar在数组上执行indexOf,例如http://www.dollarswift.org/#indexof-indexof
$.indexOf([1, 2, 3, 1, 2, 3], value: 2)
=> 1
你可以用闭包来过滤数组:
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
由于swift在某些方面比面向对象的函数性更强(数组是结构体,而不是对象),使用函数"find"对数组进行操作,返回一个可选值,所以准备好处理nil值:
let arr:Array = ["a","b","c"]
find(arr, "c")! // 2
find(arr, "d") // nil
使用firstIndex和lastIndex -这取决于你是在寻找项目的第一个索引还是最后一个索引:
let arr = ["a","b","c","a"]
let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3
如果你还在使用Swift 1.x
然后尝试,
let testArray = ["A","B","C"]
let indexOfA = find(testArray, "A")
let indexOfB = find(testArray, "B")
let indexOfC = find(testArray, "C")
斯威夫特2.1
var array = ["0","1","2","3"]
if let index = array.indexOf("1") {
array.removeAtIndex(index)
}
print(array) // ["0","2","3"]
斯威夫特3
var array = ["0","1","2","3"]
if let index = array.index(of: "1") {
array.remove(at: index)
}
array.remove(at: 1)