2015-06-11 67 views
2

如何循環訪問字典並檢查每個項目的值的類型?循環查看字典並檢查每個值類型

例詞典:

var dict = ([ 
    "a number" : 1, 
    "a boolean" : false, 
    "a string" : "Hello" 
]) 

我嘗試在檢查值:

for item in dict.1 { 
    if let current = item as? NSNumber { 
     print(current) 
    } 
} 

,我想這:

for item in settings { 
    if item[1] == item[1] as NSNumber { 
     print(item) 
    } 
} 

重要提示:

正如@Leo指出的那樣,重要的是要在比較時跟蹤字典的值類型。我作爲示例包含的字典將爲[String : NSObject],我的項目中的字典的類型爲[String : NSNumber]。他們必須以不同的方式接近!

回答

4

您可以使用is在迅速

var dict = ([ 
    "a number" : 1, 
    "a boolean" : false, 
    "a string" : "Hello" 
]) 

for (key,value) in dict{ 
    if value is String{ 
     println(value) 
    } 
} 

你也可以得到的className

for (key,value) in dict{ 
    println(String.fromCString(object_getClassName(value))) 

} 

這將記錄

Optional("__NSCFString") 
Optional("__NSCFNumber") 
Optional("__NSCFBoolean") 

更新:

斯威夫特是一個類型安全的語言,所以如果你有這樣的

var dict = ([ 
     "a number" : 1, 
     "a boolean" : false, 
     ]) 

的字典,字典是[String : NSNumber]類型,所以你不需要檢查。

但是,如果你有這樣

var dict = ([ 
     "a number" : 1, 
     "a boolean" : false, 
     "a string" : "Hello" 
     ]) 

然後字典,字典是[String:NSObject]類型,在這種情況下,你需要檢查的類型。

更新,檢查其是否爲int或布爾

更好的聲明你的字典[String:Any] 然後

 var dict:[String:Any] = ([ 
     "a number" : 1, 
     "a boolean" : false, 
     ]) 

    for (key,value) in dict{ 
     if value is Bool{ 
      println(value) 
     } 
     if value is Int{ 
      println(value) 
     } 
    } 
+0

是的,是更有意義的讓? – nPn

+0

如果只是想檢查值類型,我認爲''是足夠的。因爲,如果它是類型,我們不需要投。另外,'let as?'也是一個好方法 – Leo

+0

我嘗試的是更早,也是現在。它會拋出一個警告,說「'是'測試永遠是真實的」我正在做它如何在第一個代碼塊中完成它。除非我正在檢查一個NSNumber。有任何想法嗎? –

1

從迅速參考,在這裏是如何遍歷字典

遍歷一個字典

您可以用換在 循環遍歷鍵值對在字典中。在字典中的每個項目返回一個(鍵,值)元組, 你可以分解元組成員到臨時常量或 變量作爲迭代的一部分:

for (airportCode, airportName) in airports { 
     println("\(airportCode): \(airportName)") 
    } 
    // YYZ: Toronto Pearson 
    // LHR: London Heathrow 

所以這應該工作你的榜樣。

var dict = ([ 
    "a number" : 1, 
    "a boolean" : false, 
    "a string" : "Hello" 
    ]) 


for (k,v) in dict { 
    if let x = v as? NSNumber { 
    println("x = \(x)") 
    } 
} 
0

對於那些誰正與警告問題,請務必檢查您的類型如上面所述的@Leo。如果你的值類型是NSNumber,你會得到錯誤。如果它是NSObject類型,則使用@Leo's或@nPn的答案。

for (key, value) in settings { 

    if value == value as Bool { 
     print(value) 
    } 
    if value == value as NSNumber { 
     print(value) 
    } 
} 
+1

我覺得你的設置值都是'NSNumber'類型,所以它會給你警告 – Leo

+0

你是對的,這就是我選擇你的答案的原因。我不明白,如果我在我的例子中包含一個字符串,它會改變整個對象類型。我的項目類型確實是一個NSNumber。我已經將此作爲未來其他人的回答,並且與我一樣面臨同樣的困惑。謝謝@Leo –

+0

我也找到解決方案,我會更新我的答案 – Leo

1

您還可以使用dynamicType找到類,然後使用一個簡單的switch語句採取:

enter image description here

這在我的項目,它具有的NSNumber的值類型爲我工作適當的行動

var dict = ([ 
    "a number" : 1, 
    "a boolean" : false, 
    "astring" : "Hello" 
    ]) 

for (k,v) in dict { 
    switch "\(v.dynamicType)" { 
    case "__NSCFString": 
     println("found String = \(v)") 
    case "__NSCFBoolean": 
     println("found Boolean = \(v as! Bool)") 
    case "__NSCFNumber": 
     println("found Number = \(v)") 
    default:break 
    } 
} 
+0

這真的很整齊。我要確保明天測試一下。謝謝@nPn,+1 –