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