2016-02-28 72 views
1

在Objective-C,我們可以使用對象映射與JSON響應像這樣initWithDictionary:在Objective-C和夫特

PolicyData *policyData = [[PolicyData alloc] initWithDictionary:responseObject error:&err]; 

在這裏,我們可以用的policyData類屬性映射responseObject。 我如何在Swift中做同樣的事情?

回答

2

它應該像添加橋接頭一樣簡單(因爲PolicyData很可能寫在Objective-C中)。說明如何做到這一點can be seen in this Apple documentation

然後,你可以爲輕鬆地創建PolicyData對象做:

do { 
    let newPolicyDataObject = try PolicyData(responseObject) 
} catch error as NSError { 
    print("error from PolicyData object - \(error.localizedDescription)") 
} 

這裏假設你的responseObject是一個的NSDictionary。 Swift 2幫助(?)將錯誤參數轉換爲try/catch塊。

也就是說,的policyData的

- (instancetype) initWithDictionary:(NSDictionary *)responseObject error:(NSError *)err; 

聲明魔術般地變成

func initWithDictionary(responseObject : NSDictionary) throws 

在這個蘋果的Objective-C /斯威夫特的互操作性文檔的"Error Handling" section描述。

+0

'init'方法最有可能變成'PolicyData(dictionary:responseObject)' – vadian

+0

如果我在swift中創建PolicyData會怎麼樣?在函數initWithDictionary(responseObject:NSDictionary)拋出,我必須映射硬編碼的所有字典鍵?我不想。 – Sofeda

+0

我不知道你的PolicyData'init'方法裏面的代碼是什麼樣的......如果你使用的是AFNetworking,[其他人嘗試過這種方法](http://stripysock.com.au/blog/2014/7/11 /抓取和解析 - json-with-swift)你正在考慮,你可能有幸在[so]上挖苦。 –

2

您可以添加

convenience init?(dictionary: NSDictionary) 

你想從字典初始化和初始化它的屬性有任何對象。

然而,由於swift不會動態分派(遲早),所以您可能不會推論,期望屬性的名稱成爲任何對象字典中的鍵。

+0

你能解釋一下爲什麼Swift沒有動態調度?它會給Swift任何優於Objective-C的優勢嗎? – Sofeda

+1

動態調度可以打破雨水安全;在動態調度的情況下,可能會在運行時切換不遵守編譯器強制規則的實現。 – SmokeDispenser

+0

非常感謝Jan.有關細節理解的任何參考? – Sofeda