Swift'te bir diziye öğe ekleme


340

Diyelim ki bir dizim var, örneğin:

var myArray = ["Steve", "Bill", "Linus", "Bret"]

Ve daha sonra almak için adı geçen dizinin sonuna bir öğe eklemek / eklemek istiyorum:

["Steve", "Bill", "Linus", "Bret", "Tim"]

Hangi yöntemi kullanmalıyım?

Ve dizinin önüne bir öğe eklemek istediğim durum ne olacak ? Sabit bir zaman kayması var mı?


95
Steve Jobs, Bill Gates, Linus Torvalds, ama Bret kim? - Bilmem gerektiğini hissediyorum (ve bulduğumda kendimi tekmeleyeceğim!)
Jimmery

23
Bret Victor? worrydream.com
onekiloparsec

19
Bret Victor haklı. Çalışmalarının hızlı bölümler için ilham kaynağı olduğu söyleniyor
Fela Winkelmolen

3
yeni bir dizine öğe eklemek için hiçbir zaman alt simge kullanamazsınız . abonelik yalnızca bir değeri güncellemek veya mevcut bir dizinden okumak için kullanılır . Eğer varsa , asla bu aralık dışı hata dizin verecektir söyleyemezsiniz . Kullanmalısınız . Neden abone olamazsınız? Yapamayacağınız Aynı nedenle için . 3. dizin, bir değerden önceki dizi [0] gibi mevcut değildir! let array = [Int]()array[0] = 42array.append(42)letters[3] = dlet letters = [a,b,c]
Bal

4
Ona bunu nasıl yapacağını öğretme. Tim bu dizide izin verilmemelidir, bu başkalarına bir hakaret ....
Otziii

Yanıtlar:


604

Swift 3/4/5 itibariyle , bu aşağıdaki gibi yapılır.

Bir Dizinin sonuna yeni bir öğe eklemek için.

anArray.append("This String")

Dizinizin sonuna farklı bir Dizi eklemek için.

anArray += ["Moar", "Strings"]
anArray.append(contentsOf: ["Moar", "Strings"])

Dizinize yeni bir öğe eklemek için.

anArray.insert("This String", at: 0)

Farklı bir Dizinin içeriğini Dizinize eklemek için.

anArray.insert(contentsOf: ["Moar", "Strings"], at: 0)

Daha fazla bilgi 110 sayfasından başlayarak " Hızlı Programlama Dili " nin "Koleksiyon Türleri" bölümünde bulunabilir .


2
Mükemmel cevap. Apple'ın bunu uygulama biçimindeki tutarsızlık biraz rahatsız edici. Muhtemelen, anArray + = "Foo" anArray + = ["Foo"] ile aynı şeyi yapar. Şahsen, kendimi karıştırmamak için sadece ikinci sözdizimini kullanacağım.
original_username

11
anArray + = "Foo" artık xCode 6 beta 5'ten çalışmıyor
Amitay

Bir dizi oluşturmak ve doldurmak için yöntem ve işlevleri bir liste yapabilir misiniz ?? : D

1
Çalışma zamanında başarısız oluyor. Dizide zaten eklemeye çalıştığım öğeler var, bu yüzden bu değil. Benim geçici çözüm eklemek için çalıştığım öğe ile yeni bir dizi oluşturmak ve sonra özgün dizinin tüm öğeleri eklemek için. Bunun başka bir yerde tutma sorununun bir sonucu olduğuna eminim - bu nesneler orijinal dizi noktalarında kaldığı sürece iyi durumda, ancak iOS onları taşımaya çalışırsa (ekin bir sonucu olarak) bir çökme var. Ya da bu garip Swift / IB problemidir.
MusiGenesis

1
spliceinsertContentsOfSwift 2'de yeniden adlandırın .
Almas Sapargali

21

İsterseniz bir değişken ve / veya nesne de iletebilirsiniz.

var str1:String = "John"
var str2:String = "Bob"

var myArray = ["Steve", "Bill", "Linus", "Bret"]

//add to the end of the array with append
myArray.append(str1)
myArray.append(str2)

Onları öne eklemek için:

//use 'insert' instead of append
myArray.insert(str1, atIndex:0)
myArray.insert(str2, atIndex:0)

//Swift 3
myArray.insert(str1, at: 0)
myArray.insert(str2, at: 0)

Diğerlerinin belirttiği gibi, xCode 6.1'den itibaren artık '+ =' kullanamazsınız


2
Bir .prepend()işlev eksikliği ile , kafaya takmak iyi bir yaklaşım gibi görünüyor
Atticus

1
+ = Kullanabileceğiniz çok açıktır, ancak tek bir öğe için kullanamazsınız.
Leo Dabus

17

Sonuna eklemek için +=operatörü kullanın :

myArray += ["Craig"]
myArray += ["Jony", "Eddy"]

Bu operatör genellikle append(contentsOf:)yönteme eşdeğerdir . (Ve gerçekten eski Swift sürümlerinde, yalnızca aynı öğe türündeki diğer koleksiyonları değil, tek öğeleri ekleyebilir.)

insert(_:at:)Herhangi bir dizine eklemek için de var .

Diyelim ki, başlangıçta eklemek için bir kolaylık işlevi istiyorsanız, bunu Arraybir uzantıyla sınıfa ekleyebilirsiniz .


Türdeyse myArray, Arrayilk satır yanlıştır. +=Her iki takdirde operatörü yalnızca kullanılabilir myArrayve sağ işlenen tiptedir Array.
Bart Jacobs

1
Bu cevabı gönderdiğimde doğruydu, ama o zamandan beri dil değişti. Yanıt güncellendi.
rickster

Bunların eşdeğer olduğunu +=ve appendeşdeğer olmadığını söylemek, birincisi, işleç işlevi onu tüketir tüketmez atılacak geçici bir dizi oluşturulmasını içerir.
Cristik

10

+ = Ve + operatörlerini kullanın:

extension Array {

}

func += <V> (inout left: [V], right: V) {
    left.append(right)
}

func + <V>(left: Array<V>, right: V) -> Array<V>
{
    var map = Array<V>()
    for (v) in left {
        map.append(v)
    }

    map.append(right)

    return map
}

sonra kullan :

var list = [AnyObject]()
list += "hello" 
list += ["hello", "world!"]
var list2 = list + "anything"

İkinci fonksiyonda, sol dizi üzerinde tekrarlamaya gerek yoktur. Yapmak var copy = leftve sonra eklemek copy.append(right)yeterlidir. Swift'te, diziler referans tipler değil, değer tipleridir.
Natan R.

4

İlk konumda öğeyi kaybetmeden dizinin başına eklemek isterseniz küçük bir uzantı var

extension Array{
    mutating func appendAtBeginning(newItem : Element){
        let copy = self
        self = []
        self.append(newItem)
        self.appendContentsOf(copy)
    }
}

Hata: 'Array <Element>' türünün üyesi yok 'appendContentsOf'
Dani Kemper

3

Swift 4.1 ve Xcode 9.4.1'de

Array'a temel olarak iki şekilde nesne ekleyebiliriz

let stringOne = "One"
let strigTwo = "Two"
let stringThree = "Three"
var array:[String] = []//If your array is string type

Tür 1)

//To append elements at the end
array.append(stringOne)
array.append(stringThree)

Tip 2)

//To add elements at specific index
array.insert(strigTwo, at: 1)

İki dizi eklemek istiyorsanız

var array1 = [1,2,3,4,5]
let array2 = [6,7,8,9]

let array3 = array1+array2
print(array3)
array1.append(contentsOf: array2)
print(array1)

2

Swift Programlama Dili sayfa 143'ten:

Dizinin ekleme yöntemini çağırarak dizinin sonuna yeni bir öğe ekleyebilirsiniz

Alternatif olarak, ekleme atama işleciyle bir dizinin sonuna yeni bir öğe ekleyin (+ =)

Alıntı: Apple Inc. “Hızlı Programlama Dili”. iBooks. https://itun.es/us/jEUH0.l


2

Önerilen çözümlereappend eklemek için , bunun çoğu durumda amortize edilmiş sabit bir zaman operasyonu olduğunu bilmek yararlıdır :

Karmaşıklık: Kendinin depolaması başka bir canlı dizi ile paylaşılmadığı sürece amortismanlı O (1); Kendisi köprülü bir NSArray'ı sarmazsa O (sayma); aksi halde verimlilik belirtilmez.

consSwift için benzer bir operatör arıyorum . Orijinal diziyi değiştirmeden sabit zamanda, öğenin sonuna sabitlenmiş yeni bir değişmez dizi döndürmelidir . Henüz bunu yapan standart bir işlev bulamadım. Bir tane bulursam rapor vermeyi hatırlamaya çalışacağım!



1

Benzersiz bir nesne eklemek istiyorsanız, Dizi yapısını genişletebilirsiniz.

extension Array where Element: Equatable {
    mutating func appendUniqueObject(object: Generator.Element) {
        if contains(object) == false {
            append(object)
        }
    }
}

1

Dizi NSArray ise, dizinin addingsonuna herhangi bir nesne eklemek için bu işlevi kullanabilirsiniz , örneğin:

Hızlı 4.2

var myArray: NSArray = []
let firstElement: String = "First element"
let secondElement: String = "Second element"

// Process to add the elements to the array
myArray.adding(firstElement)
myArray.adding(secondElement)

Sonuç :

print(myArray) 
// ["First element", "Second element"]

Saygılarımızla, bu çok basit bir yol!


1

Swift 4.2: Sen kullanabilirsiniz

myArray.append("Tim") //To add "Tim" into array

veya

myArray.insert("Tim", at: 0) //Change 0 with specific location 

0

Örnek: öğrenciler = ["Ben", "Ivy", "Jordell"]

1) Bir dizinin sonuna tekli öğeler eklemek için eki (_ :) kullanın

students.append(\ "Maxime" )

2) append (contentOf :) yöntemine başka bir dizi veya herhangi bir dizi geçirerek aynı anda birden çok öğe ekleyin

students.append(contentsOf: ["Shakia" , "William"])

3) Tek elemanlar için insert (_: at :) yöntemini kullanarak dizinin ortasına yeni elemanlar eklemek için

students.insert("Liam" , at:2 )

4) Başka bir koleksiyondan veya dizi değişmezinden birden çok öğe eklemek için insert (contentOf: at :) özelliğini kullanma

students.insert(['Tim','TIM' at: 2 )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.