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

时间:2014-08-25 17:52:20

标签: ios swift nsdictionary

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

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: NSDictionary!, RSSI: NSNumber!) {}

我玩过几种不同的化身,但我从这本字典中提取数据元素的唯一方法似乎过于复杂。

例如,要从字典中提取字符串,我必须这样做:

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            
}

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

2 个答案:

答案 0 :(得分:1)

是的,有一种方法,将扩展方法添加到NSDictionary,如下所示:

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

并使用如下(在操场上测试):

var dict = NSMutableDictionary()
dict["int"] = 5
dict["string"] = "Hello"

dict.extractObjectForKey("int", type:Int.self) // Prints {Some 5}
dict.extractObjectForKey("string", type: String.self) // Prints {Some "Hello"}
dict.extractObjectForKey("int", type:String.self) // Prints nil (it's not a string)

答案 1 :(得分:0)

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

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


}