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

Posted

技术标签:

【中文标题】Swift optionals - 从\'x\'到\'x\'的条件转换警告总是成功【英文标题】:Swift optionals - warning on conditional cast from 'x' to 'x' always succeedsSwift optionals - 从'x'到'x'的条件转换警告总是成功 【发布时间】:2015-12-18 10:58:20 【问题描述】:

我想知道是否有一种方法可以关闭/避免 xcode 中的 if let...NSUserDefaults 构造中的“黄色”警告,其中密钥具有已知值。

例如:

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

由于if let,我必须使用as?。但是,由于我使用的是已知值类型(在本例中为整数),as? Int 实际上是多余的 - 这就是我收到“黄色警告”的原因。

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

【问题讨论】:

与其删除警告,不如删除错误...如果您不需要条件转换,请不要使用它。 :) 试过了。我收到一个实际错误:“条件绑定的初始化程序必须具有可选类型而不是 Int”。你是说:不要使用 'if let' 只使用 'let',因为我知道类型? 是的,我是说不要将if let ... as? ....integerForKey 一起使用,如果我没记错的话,它不会返回一个 Optional (如果该值不存在则返回 0)和不需要类型转换。 酷。别客气。我的cmets给出了正确的答案。 【参考方案1】:

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

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

就这个:

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

就足够了,因为如果.integerForKey 无法获得实际值,它只会返回0

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

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

【讨论】:

好的。所以我唯一遇到的问题是 0 (或默认答案)可能是程序/代码上下文中的有效结果。所以我想说,如果需要测试是否实际设置了一个值,并且默认返回值可能是代码上下文中的有效结果,那么应该使用“objectForKey”吗? 。对吗?【参考方案2】:

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

你会看到:

func integerForKey(_ defaultName: String) -> Int

它表明返回值是非可选的。

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

这是 Swift 的基本语义之一。

【讨论】:

以上是关于Swift optionals - 从'x'到'x'的条件转换警告总是成功的主要内容,如果未能解决你的问题,请参考以下文章

swift 可选类型(optional)--- swift 入门

Swift 可选(Optionals)类型

如何将数组从 Swift 传递到 MSL 参数(C++)

Swift之深入解析可选类型Optional的底层原理

反转 CGRect - Swift

iOS开发-Swift进阶之可选类型Optional & Equatable+Comparable协议!