2014-06-10 58 views
0

我試圖在Swift中做兩個PoC - 我的第一個實驗是一個簡單的紙牌遊戲。Swift中的for循環內的字典訪問

我遇到一個問題,嘗試訪問字典中for循環之中:

let suits: Array<String> = ["Spades", "Diamonds", "Clubs", "Hearts"] 
let ranks: Array<Integer> = [1,2,3,4,5,6,7,8,9,10,11,12,13] 
let rankMap: Dictionary<Int,String> = [1:"Ace", 11:"Jack", 12:"Queen", 13:"King"] 

struct Card { 
    let suit: String 
    let rank: Integer 
    let image: String? //There's some NSObject that corresponds to image resources. Later. 
} 

func buildDeck(NumberOfJokers:Int) -> Array<Card>{ 
    assert(NumberOfJokers <= 2, "Can't have more than two jokers in a deck") 
    var retDeck: Array<Card> = [] 
    for s in suits { 
     for r in ranks { 
      let newSuit = rankMap[r]? //ERROR: Could not find an overload for subscript that accepts the supplied arguments 
      retDeck.append(Card(suit:s, rank:r, image: nil)) 

     } 
    } 

    return retDeck 
} 

我無法弄清楚是如何使用的r電流值,同時通過循環ranks數組作爲標識符以從rankMap字典中提取適當的字符串。任何方式,我可以嘗試使用r整數字典鍵引發這個「找不到過載」消息。

我明白我會得到一個可選的rankMap,但展開/鏈接方法不會導致任何不同。

回答

2

問題是您的數組持有Integers,而您的字典使用Ints作爲鍵。更改數組以保存Ints!有關basic section of the docs中不同類型的一些說明。

// was using Integer so now use Int 
let ranks: Array<Int> = [1,2,3,4,5,6,7,8,9,10,11,12,13] 

// is keyed with Int 
let rankMap: Dictionary<Int,String> = [1:"Ace", 11:"Jack", 12:"Queen", 13:"King"] 

// hence your problem. 

下面是一個簡單的例子,顯示您的問題:

var b: Integer = 3 
var c: Int = 5 
let bc = b + c // throws error! 
+0

嗯..我不能強迫詞典使用Integer類型,拋出一個巨大的錯誤,每噸與「類型開始'integer'不符合協議......' –

+0

@ MikeyT.K。,這很奇怪,現在在數組中使用Int,我知道字典鍵必須是可散列的,我會看看我是否可以挖掘 – Firo

+0

你最後一次編輯完成了 - 文檔中的魔術字是「使用所有通用整數常量的Int類型」 - 當我更改'rows'數組以使用int而不是整數時',所有我脹。謝謝! –