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'的条件转换警告总是成功的主要内容,如果未能解决你的问题,请参考以下文章