如何在苹果的新语言Swift中从数组中取消设置/删除元素?
以下是一些代码:
let animals = ["cats", "dogs", "chimps", "moose"]
如何从数组中删除元素animals[2]
?
let
关键字用于声明不能被改变的常量。如果您想要修改一个变量,应该使用var
,例如:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
一个不改变原始集合的非变异替代方法是使用filter
创建一个新的集合,其中不包含您想要删除的元素,例如:
一个保持原始集合不变的非变异替代方案是使用 filter
创建一个没有您想要移除元素的新集合,例如:
let pets = animals.filter { $0 != "chimps" }
鉴于
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeFirst() // "cats"
print(animals) // ["dogs", "chimps", "moose"]
animals.removeLast() // "moose"
print(animals) // ["cats", "dogs", "chimps"]
animals.remove(at: 2) // "chimps"
print(animals) // ["cats", "dogs", "moose"]
针对单个元素
if let index = animals.firstIndex(of: "chimps") {
animals.remove(at: index)
}
print(animals) // ["cats", "dogs", "moose"]
对于多个元素
var animals = ["cats", "dogs", "chimps", "moose", "chimps"]
animals = animals.filter(){$0 != "chimps"}
print(animals) // ["cats", "dogs", "moose"]
filter
)会就地修改数组并返回被移除的元素。dropFirst
或dropLast
创建一个新数组。更新到Swift 5.2
chimps && moose
,您会写什么闭包呢?我正在寻找与{$0 != "chimps" && $0 != "moose"}
不同的东西。 - user1585121!==
,用于测试两个对象引用是否都引用同一对象实例。func delete(element: String) {
list = list.filter { $0 != element }
}
当然,这不仅适用于String
。
list = list.filter({ $0 != element })
。 - Craig Grummittarray.indexOf({ $0 == obj })
可以翻译为 array.index(where: { $0 == obj })
。 - jrcextension Array where Element: Equatable {
// Remove first collection element that is equal to the given `object`:
mutating func remove(object: Element) {
guard let index = firstIndex(of: object) else {return}
remove(at: index)
}
}
var myArray = ["cat", "barbecue", "pancake", "frog"]
let objectToRemove = "cat"
myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]
Int
,因为Element
是一个通用类型:var myArray = [4, 8, 17, 6, 2]
let objectToRemove = 17
myArray.remove(object: objectToRemove) // [4, 8, 6, 2]
从Xcode 10+开始,并根据WWDC 2018 session 223,“Embracing Algorithms”,未来一个好的方法将是 mutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
苹果公司的示例:
var phrase = "The rain in Spain stays mainly in the plain."
let vowels: Set<Character> = ["a", "e", "i", "o", "u"]
phrase.removeAll(where: { vowels.contains($0) })
// phrase == "Th rn n Spn stys mnly n th pln."
请查看苹果公司的文档。
所以在这个例子中,如果移除animals[2],也就是"chimps":
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }
这种方法可能更可取,因为它具有良好的可扩展性(线性 vs 平方),易读且干净。请注意,它仅适用于Xcode 10+,并且在撰写本文时处于测试版。
phrase.removeAll(where: vowels.contains)
- Leo Dabus对于Swift4:
list = list.filter{$0 != "your Value"}
如果您拥有自定义对象的数组,您可以按特定属性进行搜索,如下所示:
if let index = doctorsInArea.firstIndex(where: {$0.id == doctor.id}){
doctorsInArea.remove(at: index)
}
或者,如果您想通过姓名搜索,例如
if let index = doctorsInArea.firstIndex(where: {$0.name == doctor.name}){
doctorsInArea.remove(at: index)
}
如果你不知道想要移除的元素的索引,并且该元素符合Equatable协议,可以执行以下操作:
animals.remove(at: animals.firstIndex(of: "dogs")!)
请参见Equatable协议答案:如何执行indexOfObject或正确的containsObject
你可以这样做。首先确保Dog
确实存在于数组中,然后将其删除。如果你认为Dog
可能在你的数组中出现多次,请添加for
语句。
var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"
for object in animals {
if object == animalToRemove {
animals.remove(at: animals.firstIndex(of: animalToRemove)!)
}
}
如果你确信数组中只有一个 Dog
,那么可以直接执行以下操作:animals.remove(at: animals.firstIndex(of: animalToRemove)!)
如果你既有字符串又有数字
var array = [12, 23, "Dog", 78, 23]
let numberToRemove = 23
let animalToRemove = "Dog"
for object in array {
if object is Int {
// this will deal with integer. You can change to Float, Bool, etc...
if object == numberToRemove {
array.remove(at: array.firstIndex(of: numberToRemove)!)
}
}
if object is String {
// this will deal with strings
if object == animalToRemove {
array.remove(at: array.firstIndex(of: animalToRemove)!)
}
}
}
在 Swift 中与数组相关的操作较少
创建数组
var stringArray = ["One", "Two", "Three", "Four"]
在数组中添加对象
stringArray = stringArray + ["Five"]
从索引对象中获取值
let x = stringArray[1]
追加对象
stringArray.append("At last position")
插入对象到索引
stringArray.insert("Going", at: 1)
移除对象
stringArray.remove(at: 3)
连接对象值
var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"
stringArray += ["Five"]
or even better is stringArray += CollectionOfOne("Five")
- Leo Dabus
remove
返回已删除的元素:let animal = animals.remove(at: 2)
。 - 2Toad