斯威夫特不能附加下标?

时间:2016-08-23 22:42:46

标签: swift

我似乎无法在下标中使用.append()。

例如,这是数组:

var arrayTest = [
  "test": 8,
  "test2": 4,
  "anotherarry": [
    "test4": 9
  ]
]

我能够做到这一点:

arrayTest.append(["test3": 3])

但我无法附加到arrayTest中的数组。这就是我正在尝试的:

arrayTest["anotherarray"].append(["finaltest": 2])

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]
]