swift:修改字典中的数组(代码片段)

author author     2023-05-13     352

关键词:

如何轻松地将元素添加到字典中的数组?它总是抱怨could not find member 'append'could not find an overload for '+='

var dict = Dictionary<String, Array<Int>>()
dict["key"] = [1, 2, 3]

// all of these fail
dict["key"] += 4
dict["key"].append(4) // xcode suggests dict["key"].?.append(4) which also fails
dict["key"]!.append(4)
dict["key"]?.append(4)

// however, I can do this:
var arr = dict["key"]!
arr.append(4) // this alone doesn't affect dict because it's a value type (and was copied)
dict["key"] = arr

如果我只是将数组分配给var,修改它然后重新分配给dict,我不会复制所有内容吗?这不会有效也不优雅。

答案

Swift beta 5已经添加了这个功能,并且您已经尝试了几次尝试新方法。解包运算符!?现在将值传递给运算符或方法调用。也就是说,您可以通过以下任何方式添加到该数组:

dict["key"]! += [4]
dict["key"]!.append(4)
dict["key"]?.append(4)

与往常一样,请注意您使用的操作符 - 强制解包字典中不存在的值会给您带来运行时错误:

dict["no-key"]! += [5]        // CRASH!

而使用可选链接将无声地失败:

dict["no-key"]?.append(5)     // Did it work? Swift won't tell you...

理想情况下,您可以使用新的空合并运算符??来解决第二种情况,但是现在它无法正常工作。


来自Swift beta 5之前的答案:

这是斯威夫特的一个怪癖,你不可能做你想做的事情。问题是任何Optional变量的值实际上都是常量 - 即使强行解包也是如此。如果我们只定义一个Optional数组,那么我们可以做什么,不能做什么:

var arr: Array<Int>? = [1, 2, 3]
arr[0] = 5
// doesn't work: you can't subscript an optional variable
arr![0] = 5
// doesn't work: constant arrays don't allow changing contents
arr += 4
// doesn't work: you can't append to an optional variable
arr! += 4
arr!.append(4)
// these don't work: constant arrays can't have their length changed

你在使用字典时遇到问题的原因是,下载字典会返回一个Optional值,因为不能保证字典会有该键。因此,字典中的数组与Optional数组具有相同的行为,如上所示:

var dict = Dictionary<String, Array<Int>>()
dict["key"] = [1, 2, 3]
dict["key"][0] = 5         // doesn't work
dict["key"]![0] = 5        // doesn't work
dict["key"] += 4           // uh uh
dict["key"]! += 4          // still no
dict["key"]!.append(4)     // nope

如果你需要在字典中更改数组中的某些内容,则需要获取数组的副本,更改它并重新分配,如下所示:

if var arr = dict["key"] 
    arr.append(4)
    dict["key"] = arr

ETA:相同的技术在Swift beta 3中有效,尽管常量数组不再允许更改内容。

另一答案

作为一个简单的解决方法,您可以使用NSMutableArray:

import Foundation

var dict = Dictionary<String, NSMutableArray>()
dict["key"] = [1, 2, 3] as NSMutableArray
dict["key"]!.addObject(4)

我在我的项目中使用了这么简单的解决方案:

https://github.com/gui-dos/Guigna/blob/5c02f7e70c8ee3b2265f6916c6cbbe5cd3963fb5/Guigna-Swift/Guigna/GuignaAppDelegate.swift#L1150-L1157

另一答案

以下是我对Nate Cook所说的质量答案的评论。这就是我认为“轻松[添加]元素到字典中的数组”:

dict["key"] = dict["key"]! + 4
dict["key"] = dict["key"] ? dict["key"]! + 4 : [4]

现在,我们需要自己定义+运算符。

@infix func +<T>(array: T[], element: T) -> T[] 
    var copy = array
    copy += element
    return copy

我认为这个版本删除了太多的安全性;也许用复合算子来定义它?

@infix func +<T>(array: T[]?, element: T) -> T[] 
    return array ? array! + element : [element]


dict["key"] = dict["key"] + 4

最后,这是我能得到的最干净的,但我对这个例子中的数组值/引用如何工作感到困惑。

@assignment func +=<T>(inout array: T[]?, element: T) 
    array = array + element


dict["key"] += 5
另一答案

接受的答案绕过了以下更简单的可能性,这也适用于较旧的Swift版本:

var dict = Dictionary<String, Array<Int>>()
dict["key"] = [1, 2, 3]

print(dict)

dict["key", default: [Int]()].append(4)

print(dict)

这将打印:

["key": [1, 2, 3]]
["key": [1, 2, 3, 4]]

还有这个:

var dict = Dictionary<String, Array<Int>>()
dict["key", default: [Int]()].append(4)
print(dict)

将打印:

["key": [4]]
另一答案

使用'for in',从字典的内部数组中获取值。这是一个帮助你的例子

var a = ["x":["a","b","c"], "y":["d"]]

for b in a 
    print(b)

输出:

("x", ["d"])
("y", ["a", "b", "c"])

swift实现遍历嵌套字典并修改其中的值(代码片段)

  在swift中数组与字典都是值类型,在OC中数组与字典都是引用类型。在swift中数组或者字典增加一个新的元素,那么就会产生一个新的副本,但是在OC中可变数组或者可变字典并没有产生这样的变化。  如果要改... 查看详情

swift实现遍历嵌套字典并修改其中的值(代码片段)

  在swift中数组与字典都是值类型,在OC中数组与字典都是引用类型。在swift中数组或者字典增加一个新的元素,那么就会产生一个新的副本,但是在OC中可变数组或者可变字典并没有产生这样的变化。  如果要改... 查看详情

swift初见swift字典(代码片段)

顾名思义,当我们查字典的时候,我们会根据索引去查找我们需要查找的资源,在swift中也是如此,字典的每一个对象都包含一个key和一个value,我们通过key去查找当前这个key所对应的value,与数组不同的是... 查看详情

在 Swift 中的数组中使用多个部分和多个字典填充 TableView

】在Swift中的数组中使用多个部分和多个字典填充TableView【英文标题】:PopulatingTableViewwithmultiplesectionsandmultipledictionaryinanarrayinSwift【发布时间】:2017-07-2200:18:44【问题描述】:我有3个类别,我将其用作一个部分。在该部分中,... 查看详情

访问字典数组 Swift 3

】访问字典数组Swift3【英文标题】:AccessarrayofdictionariesSwift3【发布时间】:2017-09-2104:24:04【问题描述】:我需要访问字典数组中的工作数据,对此我有点困惑。我正在使用swift3。有人可以给我一些代码来完成它吗?我在用这个le... 查看详情

Swift 中的字典访问

】Swift中的字典访问【英文标题】:DictionaryaccessinSwift【发布时间】:2014-07-1119:26:20【问题描述】:考虑以下从plist中获取字典数组的代码:letpath=NSBundle.mainBundle().pathForResource("books",ofType:"plist")letdict=NSDictionary(contentsOfFile:path)letbook... 查看详情

在iOS9 swift中的字典类型中添加数组作为键和值

】在iOS9swift中的字典类型中添加数组作为键和值【英文标题】:AddingArraysaskey&valueinadictionarytypeiniOS9swift【发布时间】:2015-12-0714:03:27【问题描述】:我正在创建一个plist,我想在其中保存某些数据。我有一本需要写在文件中的... 查看详情

如何根据 Swift 中的数组内容对字典数组进行排序

】如何根据Swift中的数组内容对字典数组进行排序【英文标题】:HowdoIsortanarrayofdictionaryaccordingtoanarraycontentsinSwift【发布时间】:2017-02-1621:06:07【问题描述】:我有一个字典数组。我需要对该数组进行排序。排序不应该像升序或... 查看详情

swift4.2~数组和字典(array,dictionary)基本类型转换

...组值之间用逗号分隔1,如果数组声明为常量,则本身不能修改,且数组中的值也不能修改2,指定数组的类型,语法:Array<Type>可以简写为[Type]4,当检测到数组中的元素相同的时候是Swift类型的数组当检测数组中的元素类型不同... 查看详情

从字典数组映射到 Swift 中的数字数组

】从字典数组映射到Swift中的数字数组【英文标题】:MappingfromarrayofdictionariestoarrayofnumbersinSwift【发布时间】:2018-12-2423:44:34【问题描述】:这是一个函数,它应该将包含Dictionary&lt;String,Any&gt;的订单NSArray的键值对数组转换... 查看详情

将对象数组映射到 Swift 中的字典

】将对象数组映射到Swift中的字典【英文标题】:MaparrayofobjectstoDictionaryinSwift【发布时间】:2016-11-2203:17:43【问题描述】:我有一组Person的对象:classPersonletname:Stringletposition:Int数组是:letmyArray=[p1,p1,p3]我想将myArray映射为[position:n... 查看详情

Swift - 使用 swiftyJSON 根据字典中的值查找字典数组的索引

】Swift-使用swiftyJSON根据字典中的值查找字典数组的索引【英文标题】:Swift-FindtheindexofanarrayofdictionariesbasedonthevalueinthedictionariesusingswiftyJSON【发布时间】:2015-03-2410:17:17【问题描述】:我对编程很陌生,更不用说Swift了。我从以... 查看详情

将字典映射到 Swift 中的结构数组

】将字典映射到Swift中的结构数组【英文标题】:MappingadictionarytoanarrayofstructsinSwift【发布时间】:2019-01-2618:39:53【问题描述】:我的应用需要表示一组预设,其中预设由以下结构表示:structPreset:Codablevarname:Stringvarvalue:Int使用NSUse... 查看详情

为啥 Swift 中的字符串、数组和字典改为值类型

】为啥Swift中的字符串、数组和字典改为值类型【英文标题】:whystring,arrayanddictionaryinSwiftchangedtovaluetype为什么Swift中的字符串、数组和字典改为值类型【发布时间】:2015-05-2823:51:19【问题描述】:在Objc字符串中,数组和字典都... 查看详情

swift将闭包映射到swift中的数组(代码片段)

查看详情

使用日期 Swift 3 对字典数组进行排序

】使用日期Swift3对字典数组进行排序【英文标题】:SortingofarrayofdictionarywithdateSwift3【发布时间】:2017-04-2207:51:10【问题描述】:我有一个名为myArray的数组,其中添加了字典我希望该字典按时间排序,时间是字典中的一个键。那... 查看详情

从 Json 数据中分组,其中包含 Swift 4 中的字典数组

】从Json数据中分组,其中包含Swift4中的字典数组【英文标题】:GroupingfromJsondata,whichcontainarrayofdictionariesinSwift4【发布时间】:2018-06-1313:18:26【问题描述】:我有本地json文件,其中包含字典数组。我想根据json下面的键名进行分组... 查看详情

swift数组/列表中的切片对齐(代码片段)

查看详情