2014-07-07 83 views
0

我有一個函數需要一個字典,我需要解析裏面的信息。在swift字典裏訪問swift數組

我可以從字典中獲得一個NSArray,但不應該能夠訪問本機的swift數組?

class func parseResults(resultsDict:Dictionary<String, AnyObject>) -> Array<Track>? { 

     var results : NSArray = resultsDict["results"] as NSArray // This works 
     //var results : Array = resultsDict["results"] as Array<AnyObject> // This doesnt work 

     ... 
    } 

回答

0

Array是結構,這是不反對,因此你不能從AnyObject

轉換。另一方面,NSArray是一流的,所以你可以從AnyObject轉換。

+0

我知道了,謝謝。如果我使用NSJSONSerialization類來獲取NSArray或NSDictionary,我應該繼續使用基礎類還是它們的swift本地等價物來解析它的內容?換句話說,我是否應該將resultsDict更改爲NSDictionary類型? –

+0

'NSJSONSerialization'是基礎類,我建議與它一起使用基礎類,以避免不必要的橋接。 'Dictionary '無論如何不會給你更多的類型安全。 –

+0

很抱歉,這是不正確的,'NSArray'可以無縫橋接到'Array'類。閱讀我的回答和https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-XID_39 – Jack

1

本地Swift數組是作爲一個結構實現的,所以它不是AnyObject。如果你的字典中包含<String, Any>,它應該工作,因爲Array確實符合Any。

0

你可以包裝在陣列中的一類,這將解決您的問題

class WrappedArray<T> { 
    var array = Array<T>() 
} 
var dict = Dictionary<Int, WrappedArray<Int>>() 
dict[0] = WrappedArray<Int>() 
dict[0].array.append(0) 
dict[0].array.append(1) 
... 

你也可以實現在包裝類陣列的方法,並將其轉發到陣列

class WrappedArray<T> { 
    var array = Array<T>() 

    func append(_ newElement:T) { 
     self.array.append(newObject) 
    } 
} 

然後你可以像普通數組一樣使用它。

dict[0].append(0)

代替

dict[0].array.append(0)