避免迅速将字符串视为可选

时间:2018-11-22 17:45:34

标签: swift dictionary optional

我有一个函数,其中基于字典中的值定义字符串值。如果未在字典中找到值,则将其设置为静态字符串。字符串是常量(let):

let dict = [ 1: "a", 
             2: "b" ]

func x() {
    let index = someFunctionReturnsInt()
    let str = (nil != dict[index]) ? dict[index] : "N/A"

因此字符串不可能为nil。但是,当我尝试使用str时,Swift仍然认为它是可选的。例如:

    // still inside the same function
    os_log("Str is %@", str)

将返回编译器错误:

  

可选类型'String?'的值必须解包为'String'类型的值

事实是,我多次使用此功能,并且在每种情况下都添加str ?? "N/A"毫无意义。用str!强制解开似乎是一个过大的杀伤力:此字符串对于应用程序并不重要,因此我认为如果丢失执行则中止执行没有任何意义。

那么强制解包是唯一的解决方案,还是有更好的方法将字符串定义为非可选且“永远不会为零”?

3 个答案:

答案 0 :(得分:4)

问题在于dict[index]仍返回可选内容,因此str必须是可选内容。有两种修复方法

如果dict[index]不是nil,则可以使用nil合并运算符来使用,否则请使用“ N / A”

let str = dict[index] ?? "N/A"

另一种选择是使用字典默认值下标

let str = dict[index, default: "N/A"]

答案 1 :(得分:3)

在定义str本身时,只需使用nil合并运算符。检查该值是否为nil,然后仍然分配可选值而不进行拆包是没有意义的。

let str = dict[index] ?? "N/A"

答案 2 :(得分:1)

您应该使用nil合并运算符-let str = dict[index] ?? "N/A"

代替let str = (nil != dict[index]) ? dict[index] : "N/A"

在您的情况下,str仍然是可选的是因为dict[index]是可选的,即使您检查它是否为nil。那么,swift是否可以将str的类型推断为String?

您还可以强制打开包装,因为您已经在检查它是否为nil,例如- let str = (nil != dict[index]) ? dict[index]! : "N/A"

但应尽可能避免强行展开