我似乎无法在下标中使用.append()。
例如,这是数组:
var arrayTest = [
"test": 8,
"test2": 4,
"anotherarry": [
"test4": 9
]
]
我能够做到这一点:
arrayTest.append(["test3": 3])
但我无法附加到arrayTest中的数组。这就是我正在尝试的:
arrayTest["anotherarray"].append(["finaltest": 2])
答案 0 :(得分:2)
首先请注意:您的变量arrayTest
是类型[String: NSObject]
的字典,而不是数组。同样,键anotherarray
的值也是字典。
第二个注意事项:您正在设置密钥anotherarry
并检索密钥anotherarray
,在此示例中该密钥为零。
我也不确定您如何在append()
上致电arrayTest
,因为它是字典而且没有这种方法。
但是你要做的关键问题是字典和数组是值类型,并在传递时被复制,而不是被引用。当您下标arrayTest
以获取anotherarray
时,您将获得该值的副本,而不是对字典内的值的引用。
如果你想直接修改数组或字典中的内容(而不是替换它),那么必须是引用类型(类)。以下是您的代码如何完成的示例:
var arrayTest = [
"test": 8,
"test2": 4,
"anotherarray": ([
"test4": 9
] as NSMutableDictionary)
]
(arrayTest["anotherarray"] as? NSMutableDictionary)?["test5"] = 10
请注意,此代码强制执行" anotherarray"明确地是NSMutableDictionary
(来自Objective-C的类类型)而不是默认为Swift字典(值类型)。这使得从字典外部修改它成为可能,因为它现在作为参考传递而不是复制。
正如评论中所指出的,使用NSMutableDictionary不是我个人推荐的并且不是纯粹的Swift解决方案,它只是通过对代码进行最少更改来实现工作示例的方式。
您的其他选项包括完全使用修改后的副本替换anotherarray
值,而不是直接替换下标,或者如果您能够链接下标很重要,则可以创建围绕Swift字典的类包装器,如下所示:
class DictionaryReference<Key:Hashable, Value> : DictionaryLiteralConvertible, CustomStringConvertible {
private var dictionary = [Key : Value]()
var description: String {
return String(dictionary)
}
subscript (key:Key) -> Value? {
get {
return dictionary[key]
}
set {
dictionary[key] = newValue
}
}
required init(dictionaryLiteral elements: (Key, Value)...) {
for (key, value) in elements {
dictionary[key] = value
}
}
}
然后你将类似于NSMutableDictionary示例使用它:
var arrayTest = [
"test": 8,
"test2": 4,
"anotherarray": ([
"test4": 9
] as DictionaryReference<String, Int>)
]
(arrayTest["anotherarray"] as? DictionaryReference<String, Int>)?["test5"] = 10
答案 1 :(得分:1)
例如,这里是数组:
不,arrayTest
不是数组。它是一本字典。
我能够做到这一点......
不,你不是。字典中没有这样的append
方法。
所以看起来你有这样的字典
var dict: [String:Any] = [
"test": 8,
"test2": 4,
"anotherdict": ["test4": 9]
]
您想要更改键anotherdict
内的数组(是的,我重命名了您的键),以便添加以下键/值对
"finaltest": 2
这是代码
if var anotherdict = dict["anotherdict"] as? [String:Int] {
anotherdict["finaltest"] = 2
dict["anotherdict"] = anotherdict
}
结果
[
"test2": 4,
"test": 8,
"anotherdict": ["test4": 9, "finaltest": 2]
]