2014-07-07 60 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)