Apple'ın yeni dili Swift'teki bir dizideki bir öğeyi nasıl kaldırabilir / kaldırabilirim?
İşte bazı kod:
let animals = ["cats", "dogs", "chimps", "moose"]
Öğe animals[2]
diziden nasıl kaldırılabilir?
Apple'ın yeni dili Swift'teki bir dizideki bir öğeyi nasıl kaldırabilir / kaldırabilirim?
İşte bazı kod:
let animals = ["cats", "dogs", "chimps", "moose"]
Öğe animals[2]
diziden nasıl kaldırılabilir?
Yanıtlar:
let
Anahtar kelime değiştirilemez sabitleri ilan içindir. Bir değişkeni değiştirmek istiyorsanız var
bunun yerine kullanmalısınız , örneğin:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
Orijinal koleksiyonu değiştirmeden değiştirecek olmayan bir alternatif, filter
kaldırmak istediğiniz öğeler olmadan yeni bir koleksiyon oluşturmak için kullanmaktır , örneğin:
let pets = animals.filter { $0 != "chimps" }
verilmiş
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"]
Sadece bir eleman için
if let index = animals.firstIndex(of: "chimps") {
animals.remove(at: index)
}
print(animals) // ["cats", "dogs", "moose"]
Birden çok eleman için
var animals = ["cats", "dogs", "chimps", "moose", "chimps"]
animals = animals.filter(){$0 != "chimps"}
print(animals) // ["cats", "dogs", "moose"]
filter
) değiştirir ve kaldırılan öğeyi döndürür.dropFirst
veya öğesini kullanabilirsiniz dropLast
.Swift 5.2 olarak güncellendi
Yukarıdaki yanıtlar, silmek istediğiniz öğenin dizinini bildiğinizi varsayar.
Genellikle dizide silmek istediğiniz nesneye yapılan başvuruyu bilirsiniz . (Dizinizi yinelemiş ve bulmuşsunuzdur, örneğin) Bu gibi durumlarda, dizininin her yerine iletmek zorunda kalmadan doğrudan nesne başvurusu ile çalışmak daha kolay olabilir. Bu yüzden bu çözümü öneriyorum. İki nesne başvurusunun her ikisinin de aynı nesne örneğine karşılık gelip gelmediğini test etmek için kullandığınız kimlik operatörünü kullanır !==
.
func delete(element: String) {
list = list.filter() { $0 !== element }
}
Elbette bu sadece String
s için işe yaramıyor .
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
Bu silmeye başvuran diğer nesneler , yeni bir dizi atadığınız için diğer dizi başvurularını güncellemezse unutmayın list
. Bu yaklaşımla dizilerden silerseniz sadece ince bir ima.
Swift 5: İşte bir dizideki öğeleri filtrelemeden kaldırmak için serin ve kolay bir uzantı:
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)
}
}
Kullanımı:
var myArray = ["cat", "barbecue", "pancake", "frog"]
let objectToRemove = "cat"
myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]
Ayrıca gibi diğer türleri ile çalışır Int
çünkü Element
genel bir türüdür:
var myArray = [4, 8, 17, 6, 2]
let objectToRemove = 17
myArray.remove(object: objectToRemove) // [4, 8, 6, 2]
Swift4 için:
list = list.filter{$0 != "your Value"}
Xcode 10+ itibariyle ve WWDC 2018 oturum 223 "Algoritmaları Kucaklamak" a göre ileriye dönük iyi bir yöntemmutating func removeAll(where predicate: (Element) throws -> Bool) rethrows
Apple örneği:
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."
görmek Apple'ın Belgeleri
OP'nin örneğinde, hayvanları kaldırmak [2], "şempanzeler":
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }
Bu yöntem tercih edilebilir çünkü iyi ölçeklendirilir (kuadratik ve lineer), okunabilir ve temizdir. Sadece Xcode 10+ ile çalıştığını ve bu yazının beta sürümünde olduğunu unutmayın.
Birkaç Operasyon Swift'teki Dizi ile ilgilidir
Dizi Oluştur
var stringArray = ["One", "Two", "Three", "Four"]
Diziye Nesne Ekle
stringArray = stringArray + ["Five"]
Dizin nesnesinden Değer Al
let x = stringArray[1]
Nesne Ekle
stringArray.append("At last position")
Dizine Nesne Ekle
stringArray.insert("Going", atIndex: 1)
Nesneyi Kaldır
stringArray.removeAtIndex(3)
Concat Nesne değeri
var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"
Bunu yapabilirsin. Öncelikle Dog
dizide gerçekten var olduğundan emin olun , sonra kaldırın. Dizinizde birden çok kez olabileceğini for
düşünüyorsanız ifadeyi ekleyin Dog
.
var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"
for object in animals
{
if object == animalToRemove{
animals.removeAtIndex(animals.indexOf(animalToRemove)!)
}
}
Dog
Dizide çıkışlardan eminseniz ve yalnızca bir kez olduysanız, bunu yapın:
animals.removeAtIndex(animals.indexOf(animalToRemove)!)
Hem dizeleriniz hem de numaralarınız varsa
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)!)
}
}
}
Kaldırmak istediğiniz öğenin dizinini bilmiyorsanız ve öğe Equatable protokolüne uyuyorsa şunları yapabilirsiniz:
animals.removeAtIndex(animals.indexOf("dogs")!)
Eşit protokol protokolüne bakın: indexOfObject veya uygun bir içeren içerir
Dizinler dizisini kullanarak öğeleri kaldırın:
Dizeler ve dizinler dizisi
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"]
Tamsayılar ve dizinler dizisi
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]
Başka bir dizinin öğe değerini kullanarak öğeleri kaldırma
Tamsayı dizileri
let arrayResult = numbers.filter { element in
return !indexesToRemove.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
Dize dizileri
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'ın "Bilinmeyen endeks unsurunu kaldır" Alternatifine ilişkin olarak:
Nesnenin kendisi yerine bir yüklemle eşleşecek daha güçlü bir "indexOf (element)" sürümü vardır. Aynı adla gider, ancak myObjects.indexOf {$ 0.property = valueToMatch} tarafından çağrılır. MyObjects dizisinde bulunan ilk eşleşen öğenin dizinini döndürür.
Öğe bir nesne / yapı ise, o öğeyi özelliklerinden birinin değerine dayalı olarak kaldırmak isteyebilirsiniz. Örneğin, car.color özelliğine sahip bir Car sınıfınız var ve "kırmızı" arabayı arabalarınızdan kaldırmak istiyorsunuz.
if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
carsArray.removeAtIndex(validIndex)
}
Tahmin edilebilir bir şekilde, yukarıdaki if ifadesini tekrarlama / while döngüsüne gömerek ve döngüden "kırmak" için bir bayrak ayarlamak üzere başka bir blok ekleyerek "tüm" kırmızı arabaları kaldırmak için bunu yeniden çalışabilirsiniz.
Özel Nesneler diziniz varsa, aşağıdaki gibi belirli bir özelliğe göre arama yapabilirsiniz:
if let index = doctorsInArea.indexOf({$0.id == doctor.id}){
doctorsInArea.removeAtIndex(index)
}
veya örneğin ada göre aramak istiyorsanız
if let index = doctorsInArea.indexOf({$0.name == doctor.name}){
doctorsInArea.removeAtIndex(index)
}
Bunu yapmalı (test edilmedi):
animals[2..3] = []
Düzenleme: ve bunu yapmak gerekir var
, değil let
, aksi takdirde bu değişmez bir sabittir.
Bir uzantıdan öğeleri kaldırmaya özen gösteren aşağıdaki uzantı ile geldim Array
öğeleri varsayarak Array
uygulamak 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]
nesnesi kaldırılacak eklenti
extension Array {
mutating func delete(element: String) {
self = self.filter() { $0 as! String != element }
}
}
Bu uzantıyı neredeyse Varun ile aynı şekilde kullanıyorum, ancak bu (aşağıda) çok amaçlı:
extension Array where Element: Equatable {
mutating func delete(element: Iterator.Element) {
self = self.filter{$0 != element }
}
}
remove
kaldırılan öğeyi döndürür:let animal = animals.remove(at: 2)