2015-05-30 26 views
1

我想檢查字典值的類型,我用下面的測試代碼:斯威夫特:檢查類型字典值

let swiftDict = [1: "one", 2: "two"] 

if swiftDict[1] is NSString { 
    println("it's an nsstring") 
} 

我得到了編譯器警告:‘串’「演員從無關的NSString總是失敗

修改的代碼如下:

if let str = swiftDict[1] as? NSString? { 
    println("it's an nsstring") 
} 

現在,我得到編譯器警告:?從字符串有條件投地的NSString總是成功

如何解決的。上述警告是什麼?檢查變量類型的正確方法?

的原因檢查找出字符串或的NSString是否存儲。

+0

正如你專門與SWIFT類型的工作,我建議你做'如果swiftDict [1]是String' –

回答

4

爲什麼你想測試你的值類型呢,因爲Swift已經是類型安全的了?

與Objective-C相反,Swift中的數組和字典是鍵入的。因此,您的swiftDict變量的類型爲Dictionary<Int, String>(或簡稱爲[Int:String]),因此根據定義,此字典的值始終爲String

例如,如果你曾試圖寫:

let swiftDict = [1: "one", 2: "two", 3: 7] 
// error: '_' is not convertible to 'StringLiteralConvertible' 

那麼編譯器會錯誤,告訴你7型String也不敞篷不是一個String,所以你不能將其添加到swiftDict,這是推斷爲類型的[Int:String]

這意味着,按照定義,swiftDict[1]將永遠是一個String(因爲swiftDict[Int:String])......或者nil如果沒有關鍵1在該字典中。保證爲String?。所以你甚至不需要測試類型鑄造。你只需要測試它是否爲nil

if let value = swiftDict[1] { 
    println("swiftDict has a string value of \(value) for key 1") 
} else { 
    println("swiftDict does not have the key 1") 
} 

[編輯]還要注意的是StringNSString是免費電話橋接,這意味着它們是完全可互換的。因此,如果您的StringNSString,則您甚至不需要測試或投射,因爲始終可以從String投射到NSString,反之亦然(它總是可以將您的字符串解釋爲StringNSString) 。

+0

我檢查,看看是否存儲類型是NSString或String。我如何實現這一目標? – Boon

+0

'String'和'NSString'免費橋接。所以你總是可以把'String'轉換成'NSString'(提供你在某個時候導入Foundation)。所以你甚至不需要投它。但是如果你真的想要明確地強制轉換它,只要在轉換知道總是成功的時候使用'as'(如果它可能會失敗,則使用'as as''或'as !'''如果'myString'的類型'如果'myOptString'的類型是'String?',就像'swiftDict [1]',你可以簡單地將'myOptString as NSString'(''swiftDict [1]' NSString?')。無需進行條件轉換 – AliSoftware

+0

我編輯了我的答案,以提供更多關於'String'和'NSString'的信息,但基本上它們是可以互換的。 – AliSoftware

0

如果將它轉換爲字符串或NSString作爲字典中的字符序列,它無關緊要。兩者都可以工作。如果它是字典中的一個字符串,則它是一個String或一個NSString,具體取決於您將其設置爲。

if let str = swiftDict[1] as? String 
{ 
    println("it's an string") 
} 
2

如果你有混合類型的字典(即值:AnyObject),你可以通過這些迭代,並使用is檢查什麼類型的詞典,例如值

let swiftDict:[Int:AnyObject] = [1: "one", 2: "two", 3: 15, 4: true] 
for (key, value) in swiftDict 
{ 
    if (value is String) 
    { 
     println("\(key): \(value) is String") 
    } 
} 
+0

您可以在swiftDict中使用for(key,value)避免必須解開'item'元組。 – vacawama

+0

true,true。updated! – BadmintonCat

0

後衛可以用來

guard let key = swiftDict[1] else { 
       println("swiftDict does not have the key 1") 
       return; 
      }