Swift - 初始化并附加到字典中的数组的问题

时间:2014-10-07 20:31:08

标签: arrays dictionary swift

这就是我要做的事情:

我从一系列ArticleItem对象开始。这些对象的属性名为' category'这是一个字符串。我尝试遍历所有的ArticleItem对象,并在字典中使用类似的类别对项目进行分组。我使用类别名称作为我的密钥。我遇到的问题是我的字典键是保持数组,永远不会包含多于一个对象。我肯定有超过3个具有相同类别名称的对象。这是我班上的相关代码。我很想了解正确的做法。

private var _articlesDict:[String:[ArticleItem]]

init(articles:[ArticleItem]) {
    _articlesDict = [String:[ArticleItem]]()

    for item:ArticleItem in articles {
        var optionalCatArray:[ArticleItem]? = _articlesDict[item.category]
        if let catArray = optionalCatArray {
            optionalCatArray!.append(item) //why can't I do catArray.append(item)?
        } else {
            var arr:[ArticleItem] = [ArticleItem]()
            arr.append(item)
            _articlesDict[item.category] = arr
        }
    }
}

3 个答案:

答案 0 :(得分:1)

问题是数组是值类型,因此它们是按值传递的,而不是通过引用传递的。这意味着每次将包含数组的变量分配给另一个变量(或数组或字典)时,实际上都会创建它的副本。但还有更多。

第一个问题

这行代码:

if let catArray = optionalCatArray {

创建optionalCatArray的不可变副本,因此无法修改。请改用:

if optionalCatArray != nil {

第二个问题

这行代码:

var optionalCatArray:[ArticleItem]? = _articlesDict[item.category]

创建存储在字典中的数组的副本 - 这里:

if optionalCatArray != nil {
    optionalCatArray!.append(item)

将新项目分配给数组,但请记住:这是一个副本,因此您不会修改字典中包含的数组。缺少的是将其重新设置为字典:

if optionalCatArray != nil {
    optionalCatArray!.append(item)
    _articlesDict[item.category] = optionalCatArray!
}

可以通过避免像这样的数组副本来改进这段代码:

if _articlesDict[item.category]  != nil {
    _articlesDict[item.category]!.append(item)
} else {
    _articlesDict[item.category] = [item]
}

我没有测试过它,但从概念上说它应该可行。另请注意我如何缩短else分支,更易于阅读。

答案 1 :(得分:0)

您无法直接在字典中编辑数组。您只能附加到本地副本。

有关详细信息,请参阅https://stackoverflow.com/a/24251066/1183577

答案 2 :(得分:0)

作为其他答案中原生阵列解决方案的替代方案,您可以这样做:

var _articlesDict = [String:NSMutableArray]()

init(articles:[ArticleItem]) {
    for item:ArticleItem in articles {
        if let array = _articlesDict[item.category] {
            array.addObject(item)
        } else {
            _articlesDict[item.category] = NSMutableArray(object:item)
        }
    }
}

但请记住,当您从字典中的数组中提取项目时,您必须强制转换为ArticleItem