2016-03-28 11 views
5

Her bir öğeden geçiş yapmadan, Swift'in anında map kullanarak nesneler dizisini değiştirebiliyorum. Burada önceHarita, Swift 2.2 (3.0) içerisindeki nesneleri sıralamanıza yardımcı olur.

fazla ayrıntı here anlatılmıştır böyle bir şey (yapabildiklerini:

gnomes = gnomes.map { (var gnome: Gnome) -> Gnome in 
    gnome.age = 140 
    return gnome 
} 

Erica Sadun için teşekkür ve diğerleri, yeni öneriler ile gitti ve şimdi C-tarzı kurtuluyoruz döngüler ve döngü içinde var kullanarak. benim durumumda

Önce benim gnome bir sabittir sonra hatayla var kaldırmak için bir uyarı alıyorum (doğal olarak)

Soruma şudur: map içindeki dizileri veya Swift 3.0 için tamamen hazırlanmak üzere bu konudaki yeni stil döngüleri nasıl değiştiririz?

cevap

13

, sadece (değişebilir) geçici değişken göz önüne alındığında

gnomes = gnomes.map { (gnome: Gnome) -> Gnome in 
    var mutableGnome = gnome 
    mutableGnome.age = 140 
    return mutableGnome 
} 
12

(Aşağıda Gnome bir başvuru türüdür davayı takip eder; bir sınıf - sen Gnome tanımladığınız nasıl bize gösterdi beri Gnome değer türü (struct) olarak, bkz durum için @. Vadian: cevabı)


var çıkarılması referans tip nesnelerin bir dizinin değişken üye mutasyona .map kullanılarak etkilemez. Örneğin, eski yaklaşımınızı (.map kapatma imzasındaki var ihmal) kullanabilirsiniz.

class Gnome { 
    var age = 42 
} 

var gnomes = [Gnome(), Gnome(), Gnome()] 

gnomes = gnomes.map { 
    $0.age = 150 
    return $0 
} 

/* result */ 
gnomes.forEach { print($0.age) } // 3x 150 

Ancak, eğer sadece yerine yeni bir diziye .map sonucunu atama daha orijinal diziyi değiştirmek istediğiniz, .forEach.map daha uygun bir seçim olabilir. O sözdizimi tutmak istiyorsanız

gnomes.forEach { $0.age = 140 } 

/* result */ 
gnomes.forEach { print($0.age) } // 3x 140 
+0

, '' $ 0 immutable'' bir hata döndürür. Bu benim hatam.Daha kesin olmalıydım :(Sınıflar yerine yapıları kullanıyorum, bahse girerim varsayılan olarak bu değerleri değiştiremezsiniz. – kernelpanic

+0

Kernelpanic Bize 'Gnome' sınıfını göstermediğinizden beri, kendimden birini dahil etmeliydim. Sınıfınızın 'yaş 'özelliği değişebilir bir şey (yanı sıra gnomes dizisi) emin misiniz? Yukarıda Swift 2.2 ve Xcode 7.3 benim için iyi çalışıyor. – dfri

+0

@dfri Ben' Gnome' olduğunu sanmıyorum struct – vadian

1

kullanın:

struct Gnome { 
    var age: Int = 0 
} 

var gnomes = Array(count: 5, repeatedValue: Gnome()) 

... iki iyi seçenek vardır. İkinci iken

gnomes = gnomes.map{ 
    var gnome = $0 
    gnome.age = 70 
    return gnome 
} 

private "yaşlanma" üzerinde kontrol tutar ve çağrı noktasında eşleştirmesini kolaylaştırır: ilk koymak @vadian gibidir Tabii

struct Gnome { 
    private(set) var age: Int = 0 

    func aged(age: Int) -> Gnome { 
     var gnome = self 
     gnome.age = age 
     // any other ageing related changes 
     return gnome 
    } 
} 

gnomes = gnomes.map{ $0.aged(140) } 

, referans tipleri hala var onların Bu durumda daha iyi bir uyum sağlayabilen programlamada yer. Burada yaşadığımız sürtünme, bu yapıları nesnelermiş gibi ele almaya çalıştığımızı gösteriyor. İhtiyacınız olan davranış buysa, Gnome'u class olarak kullanmayı düşünmelisiniz.

İlgili konular