Ios 有没有更好的方法从字典中读取元素?

Ios 有没有更好的方法从字典中读取元素?,ios,swift,nsdictionary,Ios,Swift,Nsdictionary,我正在尝试从Swift中的NSDictionary读取数据,这是我正在实现的委托方法中的一个参数(具体地说,advertisementData参数): 我玩过几个不同的版本,但我找到的从这个字典中提取数据元素的唯一方法似乎过于复杂 例如,要从字典中提取字符串,我必须执行以下操作: let localNamePre: AnyObject? = advertisementData.objectForKey(CBAdvertisementDataLocalNameKey) if let localNa

我正在尝试从Swift中的NSDictionary读取数据,这是我正在实现的委托方法中的一个参数(具体地说,
advertisementData
参数):

我玩过几个不同的版本,但我找到的从这个字典中提取数据元素的唯一方法似乎过于复杂

例如,要从字典中提取字符串,我必须执行以下操作:

let localNamePre: AnyObject? = advertisementData.objectForKey(CBAdvertisementDataLocalNameKey)
if let localName = localNamePre as? String {
   // do stuff
}
或对于阵列:

let serviceDictPre: AnyObject? = advertisementData.objectForKey(CBAdvertisementDataServiceUUIDsKey)
if let serviceDict = serviceDictPre as? Array<CBUUID> {
   // do stuff            
}
让serviceDictPre:AnyObject?=advertisementData.objectForKey(CBAdvertisementDataServiceUUIDsKey)
如果让serviceDict=serviceDictPre as?数组{
//做事
}

这似乎是一种过度复杂的转换为最终数据类型的方法。有没有更好的方法可以跳过
AnyObject
中间变量?我尝试的所有其他方法都导致了崩溃,因为我试图打开一个nil值。

是的,有一种方法,为
NSDict添加一个扩展方法类似于这样的:

extension NSDictionary {
    func extractObjectForKey<T>(key: String, type: T.Type) -> T? {
        let value: AnyObject? = self.objectForKey(key)
        return value as? T
    }
}

为什么不实现一个实用函数来返回一个具有所需特定属性的对象呢? 声明类的示例:

class MyAdData{
 var localName : String = ""
 var serviceDict : Array = []

}
效用函数:

func getAdData(advertisementData: NSDictionary!)->myAdData{
//instantiate myAdData : MyAdData
//Do your extraction (let ... Blah Blah) and populate in myAdData
//return myAddData : MyAdData


}

这里有一些有用的答案;请注意,Cocoa正在慢慢地进行快速改造。一些框架目前比其他框架更容易访问,但您应该期待它随着时间的推移而改进,这样所需的
AnyObject
就更少了。嗯,我喜欢这个想法,但它对我不起作用。我已经实现了这个exact代码在操场上,但我得到“零”“对于每个
extractObjectForKey
调用。想法?很奇怪。。。现在试用beta 7,但仍然有效。你在用哪个版本?我也在用beta 7。这是我的游乐场的截图。我复制/粘贴了您的代码,没有做任何更改:立即尝试,但我的输出没有更改:S.尝试将扩展func重命名为其他内容(
test\u extractObjectForKey
),以确保重命名为
test\u extractObjectForKey
时其名称不会与相同的输出冲突。发生了一些奇怪的事情。谢谢你最初的建议。我会继续玩,看看能不能弄明白。
class MyAdData{
 var localName : String = ""
 var serviceDict : Array = []

}
func getAdData(advertisementData: NSDictionary!)->myAdData{
//instantiate myAdData : MyAdData
//Do your extraction (let ... Blah Blah) and populate in myAdData
//return myAddData : MyAdData


}