2016-04-14 81 views
0

可以說我有像下面的字典,想要一羣紅色的狗。我想我需要使用第一個字典來獲取所有類型「dog」的名稱數組,然後使用名稱鍵和顏色來搜索最終字典以獲得[「Polly」,「jake」]。已經使用循環,但無法弄清楚如何通過字典遍歷試圖斯威夫特字典全部包含

var pets = ["Polly" : "dog", "Joey" : "goldfish", "Alex" : "goldfish", "jake" : "dog"] 

var petcolor = ["Polly" : "red", "Joey" : "black", "Alex" : "yellow", "jake":red"] 
+1

使用對象可能比詞典更好。 – brimstone

回答

1

的正確的解決方案似乎是t o創建一個結構(或類)Pet並將所有這些信息整理到一個結構中,並構建一個包含這些值的數組或字典。

struct Pet { 
    let name: String 
    let type: String 
    let color: String 

    init(name: String, type: String, color: String) { 
     self.name = name 
     self.type = type 
     self.color = color 
    } 
} 

現在,讓我們來構建這些寵物的數組:

var goodPets = [Pet]() 

for (petName, petType) in pets { 
    guard let petColor = petcolor[petName] else { 
     // Found this pet's type, but couldn't find its color. Can't add it. 
     continue 
    } 

    goodPets.append(Pet(name: petName, type: petType, color: petColor)) 
} 

現在,我們已經填寫了goodPets,拉出寵物的任何特定子集變得非常容易:

let redDogs = goodPets.filter { $0.type == "dog" && $0.color = "red" } 

雖然這個答案看起來像很多設置& legwork與其他答案相比,主要advant這裏的年齡是,一旦我們建立goodPets陣列,任何我們想舀寵物的方式最終會變得更有效率。而隨着我們增加寵物的財產數量,與其他答案相比,這變得越來越真實。


如果你寧願保存在一個字典繼續使用該名稱作爲關鍵字我們的模型對象,我們可以做到這一點爲好,但過濾看起來有點陌生。

構建字典看起來大多相同:

var goodPets = [String : Pet]() 

for (petName, petType) in pets { 
    guard let petColor = petcolor[petName] else { 
     // Found this pet's type, but couldn't find its color. Can't add it. 
     continue 
    } 

    goodPets[petName] = (Pet(name: petName, type: petType, color: petColor)) 
} 

但過濾器略有不同:

let redDogs = goodPets.filter { $0.1.type = "dog" && $0.1.color = "red" } 

注意,在這兩種情況下,redDogs有型[Pet],也就是說,一個Pet值的數組。

+0

即將使用這個,因爲我計劃添加標準。讓我們說一個用戶輸入一個類型,而不是一個顏色:有什麼辦法可以忽略缺乏顏色標準,並給所有的狗沒有一堆if語句? – user3015221

+0

@ user3015221從這一點來看,最好的辦法是實現*作品*,然後開始[Code Review](http://codereview.stackexchange.com/help/on-topic)以​​清理它。 – nhgrif

0

你可以通過這樣的字典迭代:

for key in pets.keys() { 
    if pets[key] == "Dog" { 

    } 
} 

或者:

for (name, pet) in pets { 
    if pet == "Dog" { 
    } 
} 
+0

謝謝工作完美無瑕! – user3015221

0

nhgrif約爲結構可能是正確的,但是,回答字面問題:

let dogs = Set(pets.filter { $0.1 == "dog" }.map { $0.0 }) 
let redAnimals = Set(petscolor.filter { $0.1 == "red" }.map { $0.0 }) 

let redDogs = dogs.intersect(redAnimals) 

每個filter是一個(鍵,值)元組工作的塊,測試值,並最終創建一個帶有詞典只有匹配(鍵,值)對。然後,每個map都會通過丟棄這些值並保留鍵來將該過濾的字典轉換爲數組。

將每個陣列變成一組以支持intersect操作。 intersect然後確定兩個結果的交集。