gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:21:35 25 4
gpt4 key购买 nike

这就是我正在尝试做的事情:

我从一个 ArticleItem 对象数组开始。这些对象有一个名为“category”的属性,它是一个字符串。我正在尝试循环遍历所有 ArticleItem 对象,并将字典中具有类似类别的项目分组。我使用类别名称作为我的键。我遇到的问题是我的字典键是保存数组,永远不会包含超过 1 个对象。我肯定有超过 3 个具有相同类别名称的对象。这是我类(class)的相关代码。我很想了解执行此操作的正确方法..

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

最佳答案

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

第一个问题

这行代码:

if let catArray = optionalCatArray {

创建 optimalCatArray 的不可变副本,因此无法对其进行修改。使用这个代替:

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 分支,以便于阅读。

关于arrays - Swift - 初始化和附加到字典中的数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26244740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com