这就是我要做的事情:
我从一系列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
}
}
}
答案 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
。