Swift 选项 - 从 'x' 到 'x' 的条件转换警告总是成功

Swift optionals - warning on conditional cast from 'x' to 'x' always succeeds

我想知道是否有一种方法可以在 xcode 中将 off/avoid 'yellow' 警告转换为 if let...NSUserDefaults 构造,其中密钥具有已知值。

例如:

if let x = NSUserDefaults.standardUserDefaults().integerForKey("myKey") as? Int {...}

因为 if let 我必须使用 as?。但是,由于我使用的是已知值类型(在本例中为整数),as? Int 实际上是多余的 - 这就是为什么我得到 'yellow warning'.

想法?有没有更好的方法来编写这些类型的结构?

我的建议是解决问题而不是消除警告。 :)

NSUserDefaults.standardUserDefaults().integerForKey("myKey") 不是 return 可选的,并且类型是已知的,因此您既不需要使用 if let 进行可选绑定,也不需要使用 as? 进行类型转换.

就是这个:

let x = NSUserDefaults.standardUserDefaults().integerForKey("myKey")

就足够了,因为 .integerForKey 如果无法获得实际值,则只需 returns 0

如果您不喜欢这种获取默认值的行为(我不喜欢),则不要使用 .integerForKey 并使用 objectForKey 以及可选的绑定和类型转换。就像您第一次做的那样,但是 .objectForKey 替换了 .integerForKey。这样,如果键的值无法访问,而不是默认值,您将得到一个实际的 nil。

if let x = NSUserDefaults.standardUserDefaults(). objectForKey("myKey") as? Int {...}

首先始终检查签名:
-单击符号 integerForKey: 或查看快速帮助。

您将看到:

func integerForKey(_ defaultName: String) -> Int

它显示 return 值是非可选值。

可以按照 Eric 的回答中的描述直接检索非可选值,无需任何类型转换,可选绑定会导致错误。

这是 Swift 中的基本语义之一。