【问题标题】:Adding the values of two [String : Int] dictionaries in Swift在 Swift 中添加两个 [String : Int] 字典的值
【发布时间】:2019-07-11 15:40:40
【问题描述】:

所以我尝试使用最新的 Swift 在 Xcode 中添加两个 [String : Int] 字典的值。我的代码如下所示。两个字典都有从 q1q23 的键,并附加了值。这就是随机数在 23 处停止的原因。密钥 q1 在此函数中没有用(这就是随机数从 2 开始的原因)。字典值是由另一个视图控制器在 segue 到这个 viewController 期间给出的,我没有手动分配它们。字典中的值不需要是可选的,因为它们已被分配值以获取此 viewController。

我已经在谷歌上搜索了一个小时,但我无法理解它们将应用于此的 reduce、combine 或 map 函数,并且当我只想添加时做一些如此复杂的事情似乎我忽略了一个更简单的方法.

var p1Pre:[String:Int]  = [“q1” : 1]

var p2Pre:[String:Int]  = [“q1” : 1]
var combPre:[String:Int]  = [“q1” : 0]

var pick = 0

// generates random number 2-23
func pickRandom(){
    pick = Int.random(in:2...23)
} 

func addPrefs(){
    // this is where i'm having trouble
    combPre[“q\(pick)] = p1Pre[“q\(pick)”] + p2Pre[“q\(pick)”]
    print(combPre[“q\(pick)”]
    // I get an error at the plus sign here
}

我正在尝试在两个字典(p1Prep2Pre)内的特定键处添加值,结果将存储在 combPre 中。我想构建一个函数,所以如果p1Pre[“q2”] == 1p2Pre[“q2”] == 2,那么combPre[“q2”] = 3。 我在显示 “binary operator “+” cannot be applied to two ‘Int?’ Operands" 的加号处收到错误消息。我将如何进行这项工作?谢谢

【问题讨论】:

  • 问题是没有保证p1Pre[“q\(pick)”] 存在。所以它的值是一个可选的 Int (解释你的错误消息Int?的部分)。
  • 你可以用反引号写inline highlighted code
  • 我可以强制它不是可选的吗?因为我知道运行这段代码时它会一直存在。我相信它被称为强制展开?我怎么做?谢谢。
  • 只需在变量名旁边添加一个!。请注意,如果由于某种原因它不存在,应用程序将崩溃。

标签: swift


【解决方案1】:

当您使用下标访问字典时,表达式的类型始终是值类型的可选,因为您使用的键可能不存在于字典中。您不能将两个可选的Ints 添加在一起。

您需要考虑“如果字典中不存在键 “q\(pick)” 怎么办?”,并相应地解开这两个可选项。

在我看来,这里明智的做法是,当key不存在时,只需使用值0,因为它是加法的标识:

combPre[“q\(pick)] = (p1Pre[“q\(pick)”] ?? 0) + (p2Pre[“q\(pick)”] ?? 0)

如果您100%确定密钥存在,则可以考虑强制解包:

combPre[“q\(pick)] = p1Pre[“q\(pick)”]! + p2Pre[“q\(pick)”]!

只有在您100%确定时才这样做,例如“如果密钥不存在,那么肯定发生了非常糟糕的事情”这种情况。

【讨论】:

  • “如果键不存在,那么肯定发生了一些非常糟糕的事情” - 你的意思是“如果键不存在,那么真的很糟糕 将会发生”。 :)
  • @rmaddy 不,我的意思是说,只有在“密钥在那里”是前提条件时,您才应该强制解包。因此,如果您处于一种情况,如果密钥不存在意味着您的应用程序无法从导致它们不存在的任何错误中恢复。你还不如用! 崩溃。
  • 谢谢!很好的解释!您回答了我的问题,并教会了我一个全新的可能解决方案!谢谢!如果不为键 q1 到 q23 分配值,用户将无法进入该屏幕。如果他们没有点击按钮来分配值,应用程序将永远不会在这里继续。
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多