2016-04-13 15 views
1

elemanları ve Swift sözlüklerden (veri) bir dizi listesi eşleşirse:Kontrol sözlükleri bir dizi değeri dizisi Bir dizi (öğeler) sahip

let items = [2, 6, 4] 

var data = [ 
    ["id": "1", "title": "Leslie", "color": "brown"], 
    ["id": "8", "title": "Mary", "color": "red"], 
    ["id": "6", "title": "Joe", "color": "blue"], 
    ["id": "2", "title": "Paul", "color": "gray"], 
    ["id": "5", "title": "Stephanie", "color": "pink"], 
    ["id": "9", "title": "Steve", "color": "purple"], 
    ["id": "3", "title": "Doug", "color": "violet"], 
    ["id": "4", "title": "Ken", "color": "white"], 
    ["id": "7", "title": "Annie", "color": "black"] 
] 
İsterdim

bir oluşturmak için "id" öğesi, "items" dizisinde belirtilen sayılara eşit olan sözlüklerin dizilerini içeren dizidir. Aka Ben bir dizi olan ile bitirmek istiyorum:

var result = [ 
    ["id": "6", "title": "Joe", "color": "blue"], 
    ["id": "2", "title": "Paul", "color": "gray"], 
    ["id": "4", "title": "Ken", "color": "white"] 
] 

Ben yüklemler kullanmaya çalışıyor, ancak şiddetli baş ağrısı ve onlarla hiçbir yerde alamadım bir kalp durması sonrasında edildi. Bu görev için çok karmaşık görünüyorlar. Şimdi basit bir giriş döngüsünde bunu yapmak istediğim noktadayım.

Bunu, yüklemleri veya başka bir şeyi kullanarak yapmak için akıllıca bir yol var mı? Böyle

cevap

4

kullanın filter ve contains:

let result = data.filter { dict in 
    if let idString = dict["id"], id = Int(idString) { 
     return items.contains(id) 
    } 
    return false 
} 
0

bu deneyin, çalışması gerekir:

let items = [2, 6, 4] 
var data = [ 
    ["id": "1", "title": "Leslie", "color": "brown"], 
    ["id": "8", "title": "Mary", "color": "red"], 
    ["id": "6", "title": "Joe", "color": "blue"], 
    ["id": "2", "title": "Paul", "color": "gray"], 
    ["id": "5", "title": "Stephanie", "color": "pink"], 
    ["id": "9", "title": "Steve", "color": "purple"], 
    ["id": "3", "title": "Doug", "color": "violet"], 
    ["id": "4", "title": "Ken", "color": "white"], 
    ["id": "7", "title": "Annie", "color": "black"] 
] 

var result = [Dictionary<String, String>]() 

for index in 0..<data.count { 
    let myData = data[index] 
    let dataID = data[index]["id"] 
    for i in 0..<items.count { 
     if dataID == "\(items[i])" { 
      result.append(myData) 
     } 
    } 
} 

for i in 0..<result.count { 
    print(result[i]) 
} 

Sonucu geçerli: cevap için

enter image description here

0

herkese teşekkürler! Bence Eric D'nin çözümü, neyin peşinde olduğumun en yakınına geliyor.

Sonunda raywenderlich.com iyi bilgi ile çözüm bulmak mümkün oldu: İlk ben onu yıkmak için, (Eric D önerdi ne yine çok yakın) o yöntemi kullanarak https://www.raywenderlich.com/82599/swift-functional-programming-tutorial

:

func findItems(value: [String: String]) -> Bool { 
    return items.contains(Int(value["id"]!)!) 
} 
var result = data.filter(findItems) 
I daha da azaltabilir

edilene: yine, bir tek hat indirgenebilir

var result = data.filter { 
    (value) in items.contains(Int(value["id"]!)!) 
} 

deki gibi:

var result = data.filter { items.contains(Int($0["id"]!)!) } 

Herkese tekrar teşekkürler!

+0

Yalnızca sorun, çözüm (ler) in * güvenli olmaması *. Zorla açma zorunluluğu var ve daha sonra sorunlara neden olabilir. Bu yüzden cevabımda 'izin ver' kullanıyorum. Örneğin, son çözümünüz eksi güvenlik, benimki ile tam olarak eşdeğerdir. : / – Moritz