当前位置: 首页 > 面试题库 >

迅捷:在字典中修改数组

艾茂学
2023-03-14
问题内容

如何轻松将元素添加到字典中的数组?总是抱怨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...

理想情况下,您将能够使用新的null合并运算符??来解决第二种情况,但是现在不起作用。

迅捷Beta 5之前的答案:

Swift的古怪之处在于,您不可能做自己想做的事情。问题是任何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中也有效,尽管常量数组不再允许更改内容。



 类似资料:
  • 问题内容: 我正在尝试编写一个快速的iOS应用程序,它将记录用户的声音。我已经迅速编写了以下代码,但是无法从用户那里请求麦克风权限。它可以正常打印,但从不记录音频,并且在“隐私”下的“设置”窗格中未列出该应用程序。如何快速请求录制权限? 问题答案: 从iOS 7开始,您需要检查它是否响应选择器 我已经使用带有 iOS 8 Beta* 的 iPhone 5S 测试了此代码,它可以完美运行。授予权限后

  • 问题内容: 假设我们有一个Python字典,我们正在像这样迭代它: (并且仅仅是一些黑盒转换。) 换句话说,我们尝试在使用对其进行迭代的同时向其中添加/删除项目。 这个定义好吗?您能否提供一些参考来支持您的答案? (很明显,如果损坏了该如何解决,所以这不是我所追求的角度。) 问题答案: 在python文档页面(针对2.7)上明确提到了 使用而添加或删除字典条目可能会产生一种或无法遍历所有条目。 对

  • 问题内容: Swift中“ with”关键字的目的是什么?到目前为止,我发现如果需要覆盖现有的全局函数(例如toDebugString),则可以使用关键字。 问题答案: 是 不是 一个关键字-它只是一个外部的参数标识。这也可以: 由于已经定义了函数,因此通过使用外部参数,您将创建 重载 :相同的函数名称,但参数不同。在这种情况下,参数是相同的,但是用一个外部名称标识,并且迅速使它成为具有不同签名的

  • 问题内容: 我有以下字典: 我想将一个条目附加到key1-> key2-> key3上,其值为’blah’,产生: 我正在寻找一种与键的数量无关的通用解决方案,即即使不存在从key3向下的键,key1-> key2-> key3-> key4-> key5也应该起作用。这样我得到: 提前致谢。 问题答案: 您可以使用该函数遍历一系列嵌套字典: 演示: 当密钥不存在时,此版本引发异常: 但您可以替换

  • 默认安装之后的 linux mint 的部分按键会和一些关键应用发生冲突,因此考虑修改。 IntelliJ Idea ctrl + alt + left/right 在 idea 中,ctrl + alt + left/right 用于在光标在文件的上一个未知/下一个位置之间跳转,非常方便。 但是默认 linux mint 是将这个快捷键分配给了工作区的上一个工作区/下一个工作区,直接冲突了。 修

  • 问题内容: 如何在with中检测数据的变化?以下代码不进行任何检测。 我在声明: 谢谢斯科特 问题答案: 您需要设置UITextView 委托并在其中实现textViewDidChange:方法。不幸的是,我不知道是否可以在线获得快速文档。所有链接都转到Objective- C文档。 该代码将如下所示:( 已针对SWIFT 4.2更新 )