我有一个包含Dictionary的Swift词典,我想使用stored属性来访问键值:
var json = [NSObject:AnyObject]()
var title: String {
get {
return (self.json["category"]! as [NSObject: AnyObject])["title"] as String
}
set {
// var dict = (self.json["category"]! as [NSObject: AnyObject])
// dict["title"] = newValue
(self.json["category"]! as [NSObject: AnyObject])["title"] = newValue
}
}
最后一行抛出一个编译错误:postfix'!'的操作数应该有可选的类型; type是'(NSObject,AnyObject)'
显然基于编译错误,编译器认为self.json [“category”]是无法转换为Dictionary的(NSObject,AnyObject)类型!
我认为这应该是常用用法?你会如何正常访问词典词典?
答案 0 :(得分:1)
我承认我仍然不了解这里的工作机制,但我确实看到了这样的模式:Swift并不想从AnyObject
转向可变类型的对象。它更倾向于向下转换为不可变类型,这就是为什么你注意到上面的不对称:你的getter没问题,但你的setter却没有。
我不知道你所有的约束条件是什么,但看似更可靠的方法来做你正在尝试的事情就是使用NSMutableDictionary
,这样可以向你的心脏倾斜。内容:
class UsingNSMutableDictionary {
var json = NSMutableDictionary()
var title: String {
get {
return self.json["category"]!["title"] as String
}
set {
(self.json["category"] as NSMutableDictionary)["title"] = newValue
}
}
}
在Swift中处理JSON已经引发了很多讨论,并且产生了不止一些库。如果您正在寻找实用的工作解决方案来使用JSON,我建议您尝试使用其中一个库 - 他们倾向于采用更强大的方法来处理Swift与处理JSON中固有的动态类型。
答案 1 :(得分:0)
这是一个元组。我们需要的是字典。
set {
// var dict = (self.json["category"]! as [NSObject: AnyObject])
// dict["title"] = newValue
// self.json["category"] = dict
var category: [NSObject: AnyObject] = self.json["category"] as [NSObject: AnyObject]
category["title"] = newValue
}