2014-08-27 54 views
14

我已經將一個參數傳遞給AnyObject類型的函數,因爲任何東西都可以傳遞給它。有沒有辦法讓動態傳遞的對象的類型?在Swift中動態獲取AnyObject的類型

+0

我會說,這個主題沒有人回答沒有幫助我。我的問題是我無法獲取調試期間的類型信息,要知道如何處理Any對象,看到實際的內容,因爲我不知道任何對象的類型,我不知道我需要哪種類型投它來看內容。 對我來說最好的解決方案是將Any對象轉換爲NSObject,並將它看作className屬性,例如: ((作爲NSObject的[json [「glossary」]] [「title」]作爲NSObject).className 它顯示我「__NSDictionaryM 「,例如: – Pavel 2017-03-14 23:19:12

回答

12

通常這是仿製藥的。在不與ObjC交互的代碼中使用AnyObject的原因很少。如果您然後根據類型執行不同的操作,那麼您可能實際上意圖使用重載。

也就是說,有幾種訪問類型的方法。通常,你要根據不同型號運行不同的代碼,所以你可以使用一個switch

let x:AnyObject = "asdf" 
switch x { 
case is String: println("I'm a string") 
default: println("I'm not a string") 
} 

let x:AnyObject = "asdf" 
switch x { 
case let xString as String: println("I'm a string: \(xString)") 
default: println("I'm not a string") 
} 

或者你可以使用一個if:

if let string = x as? String { 
    println("I'm a string: \(string)") 
} 

有關更多討論,請參閱Swift編程語言中的「爲Any和AnyObject類型轉換」。

但是,除非您使用ObjC代碼,否則很少有理由使用AnyAnyObject。泛型和重載是用於解決Swift中這些問題的工具。

0

首次進口基金會

,如果你wan't test1的類型做到這一點:

var test1 = "test" 

println(_stdlib_getTypeName(test1)) 

你會得到 「的TTS」 的TTS意味着字符串。

,如果你要做一個誠信嘗試將TTSI(我對於int)

+1

請記住,這些類型的名稱是私人的,隨時可能更改。函數名稱中的前導下劃線是Apple的一個指示器,它是一個內部函數,不打算從stdlib外部調用。 – 2014-08-27 13:52:27

+0

使用未解析的標識符'_stdlib_getTypeName' – Sander 2016-10-20 19:19:32

28

目前還不清楚你的問題中「類型」是什麼意思。對於任何類型的斯威夫特的任何值,就可以得到其動態運行時類型是這樣的:

theVariable.dynamicType 

什麼,你可以用它做的是另外一個問題。

斯威夫特3版本@jojodmo的提示:

type(of: theVariable) 
+0

這應該是這個問題的答案。 – 2016-07-01 18:57:47

+8

在Swift 3中,它已被更改爲'type(of:theVariable)' – Jojodmo 2016-09-12 02:24:55

0
func testType(value:AnyObject!){ 

    if let v = value as? NSString{ 

     println("NSString") 

    }else if let v = value as? NSNumber{ 

     println("NSNumber") 

    }else if let v = value as? Double{ 

     println("Double") 

    }else if let v = value as? Int{ 
     println("Int") 
    } 
} 
+0

請添加一些解釋。 – 2015-07-08 05:52:16