关键词:
如何轻松地将元素添加到字典中的数组?它总是抱怨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)
我在我的项目中使用了这么简单的解决方案:
以下是我对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<String,Any>的订单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下面的键名进行分组... 查看详情