回答:
let
キーワードを変更することはできません定数を宣言するためです。変数を変更する場合は、var
代わりに使用する必要があります。例:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
元のコレクションを変更せずに維持するための非変異型の代替方法は、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"]
1つの要素のみ
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に更新
上記の回答は、削除する要素のインデックスがわかっていることを前提としているようです。
多くの場合、配列内で削除するオブジェクトへの参照を知っています。(たとえば、配列を反復処理してそれを見つけた場合など)このような場合、インデックスをどこにも渡さなくても、オブジェクト参照を直接操作する方が簡単な場合があります。したがって、私はこの解決策を提案します。これは、2つのオブジェクト参照が両方とも同じオブジェクトインスタンスを参照しているかどうかをテストするために使用するID演算子 !==
を使用します。
func delete(element: String) {
list = list.filter() { $0 !== element }
}
もちろん、これはString
s だけでは機能しません。
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
新しい配列を割り当てているため、他のオブジェクトがこの削除を参照しても、他の配列参照は更新されないことに注意してくださいlist
。この方法で配列から削除した場合、ほんのわずかな影響があります。
Swift 5:これ は、フィルタリングせずに配列内の要素を削除するためのクールで簡単な拡張機能です。
extension 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]
Swift4の場合:
list = list.filter{$0 != "your Value"}
Xcode 10+以降、およびWWDC 2018セッション223「Embracing Algorithms」によると、今後の良い方法はmutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
Appleの例:
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."
OPの例では、動物を削除します[2]、「チンパンジー」:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }
この方法は、スケーリングがよく(線形対2次)、読み取り可能でクリーンであるため、推奨される方法です。これはXcode 10以降でのみ機能し、執筆時点ではベータ版です。
Swiftの配列に関連する操作はほとんどありません
アレイを作成
var stringArray = ["One", "Two", "Three", "Four"]
配列にオブジェクトを追加
stringArray = stringArray + ["Five"]
Indexオブジェクトから値を取得
let x = stringArray[1]
オブジェクトを追加
stringArray.append("At last position")
インデックスにオブジェクトを挿入
stringArray.insert("Going", atIndex: 1)
オブジェクトを削除
stringArray.removeAtIndex(3)
連結オブジェクト値
var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"
あなたはそれを行うことができます。最初にDog
本当に配列に存在することを確認してから、それを削除します。アレイで複数回発生する可能性があるfor
と思わDog
れる場合は、ステートメントを追加してください。
var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"
for object in animals
{
if object == animalToRemove{
animals.removeAtIndex(animals.indexOf(animalToRemove)!)
}
}
確かにDog
配列に存在し、一度だけ発生した場合は、次のようにします。
animals.removeAtIndex(animals.indexOf(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.removeAtIndex(array.indexOf(numberToRemove)!)
}
}
if object is String
{
// this will deal with strings
if object == animalToRemove
{
array.removeAtIndex(array.indexOf(animalToRemove)!)
}
}
}
削除する要素のインデックスがわからず、要素がEquatableプロトコルに準拠している場合は、次の操作を実行できます。
animals.removeAtIndex(animals.indexOf("dogs")!)
Equatableプロトコルの回答を参照してください:indexOfObjectまたは適切なcontainsObjectの実行方法
インデックス配列を使用して要素を削除します。
文字列とインデックスの配列
let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
let indexAnimals = [0, 3, 4]
let arrayRemainingAnimals = animals
.enumerated()
.filter { !indexAnimals.contains($0.offset) }
.map { $0.element }
print(arrayRemainingAnimals)
//result - ["dogs", "chimps", "cow"]
整数とインデックスの配列
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
let indexesToRemove = [3, 5, 8, 12]
numbers = numbers
.enumerated()
.filter { !indexesToRemove.contains($0.offset) }
.map { $0.element }
print(numbers)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
別の配列の要素値を使用して要素を削除します
整数の配列
let arrayResult = numbers.filter { element in
return !indexesToRemove.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
文字列の配列
let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
let arrayRemoveLetters = ["a", "e", "g", "h"]
let arrayRemainingLetters = arrayLetters.filter {
!arrayRemoveLetters.contains($0)
}
print(arrayRemainingLetters)
//result - ["b", "c", "d", "f", "i"]
「不明なインデックスの要素を削除」するための@Suragchの代替案について:
オブジェクト自体ではなく述語で一致する「indexOf(element)」のより強力なバージョンがあります。名前は同じですが、myObjects.indexOf {$ 0.property = valueToMatch}によって呼び出されます。myObjects配列で最初に見つかった項目のインデックスを返します。
要素がオブジェクト/構造体の場合、そのプロパティのいずれかの値に基づいてその要素を削除することができます。たとえば、car.colorプロパティを持つCarクラスがあり、carsArrayから「赤い」車を削除するとします。
if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
carsArray.removeAtIndex(validIndex)
}
おそらく、これをやり直して、上記のifステートメントをrepeat / whileループ内に埋め込み、elseブロックを追加してフラグをループから「ブレーク」するように設定することで、「すべての」赤い車を削除できます。
実装Array
内の要素を想定して、から要素を削除する次の拡張機能を思いつきました。Array
Equatable
extension Array where Element: Equatable {
mutating func removeEqualItems(item: Element) {
self = self.filter { (currentItem: Element) -> Bool in
return currentItem != item
}
}
mutating func removeFirstEqualItem(item: Element) {
guard var currentItem = self.first else { return }
var index = 0
while currentItem != item {
index += 1
currentItem = self[index]
}
self.removeAtIndex(index)
}
}
var test1 = [1, 2, 1, 2]
test1.removeEqualItems(2) // [1, 1]
var test2 = [1, 2, 1, 2]
test2.removeFirstEqualItem(2) // [1, 1, 2]
Stringオブジェクトを削除する拡張機能
extension Array {
mutating func delete(element: String) {
self = self.filter() { $0 as! String != element }
}
}
私はこの拡張を使用します。これはVarunの拡張とほとんど同じですが、この拡張(下記)は多目的です。
extension Array where Element: Equatable {
mutating func delete(element: Iterator.Element) {
self = self.filter{$0 != element }
}
}
remove
削除された要素を返します:let animal = animals.remove(at: 2)