gpt4 book ai didi

swift - 从可选容器中提取非可选值的最佳方法

转载 作者:行者123 更新时间:2023-11-28 10:18:33 25 4
gpt4 key购买 nike

这是一个最佳实践问题,我觉得我缺少一个明显的解决方案...

我很困惑为什么当 wantsGroundAlways 为 false 且 I1 未定义时,这段代码会通过 if:

let i = c.data["I1"]?.integerValue
if !wantsGroundAlways && i == 0 { return }

问题是 data["I1"] 根据定义是可选的,因此 Swift 将 i 推断为 int?,并且nil != 0。微妙,但回想起来很明显。

但是处理这种常见情况的最佳方法是什么?一种解决方案是:

let i = (c.data["I1"] ?? 0).integerValue

但我个人认为这看起来很糟糕并且隐藏了意图。类似的东西:

guard let i = c.data["I1"]?.integerValue else { i = 0 }

会让你想做什么很明显,但它不起作用,因为 i 不能在 else 子句中访问并且 { let i = 0 } 不一样 i(试试吧,你会明白我的意思)。

现在是这样的:

guard let arcradius = c.data["F1"]?.doubleValue else { return }

这似乎真的接近我想做的事情,但我不确定这是否真的是我认为的意思 - 如果 F1 不在字典中,返回真的会触发吗?那个版本和这个有什么区别:

guard case let arcradius = c.data["F1"]?.doubleValue else { return }

哪个告诉我它总是正确的?

我想我在这里遗漏了一些关键的东西......那么在这些情况下你们都做了什么?

最佳答案

我认为这是解决您的第一个问题的最直接和最具表现力的方式:

let i = c.data["I1"]?.integerValue ?? 0

它不需要括号,并显示意图。

??nil 合并运算符。这是一个二元运算符。如果左操作数不是nil,则返回它,否则返回右操作数。

c.data["I1"] 可以是 nil(因为 "I1" 键可能没有值)。在这种情况下,c.data["I1"]?.integerValue 将为 nil?? 将返回 0。如果一切顺利,并且左侧不是 nil,它将被返回,忽略 0

关于swift - 从可选容器中提取非可选值的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com