我有一个函数,其中基于字典中的值定义字符串值。如果未在字典中找到值,则将其设置为静态字符串。字符串是常量(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!
强制解开似乎是一个过大的杀伤力:此字符串对于应用程序并不重要,因此我认为如果丢失执行则中止执行没有任何意义。
那么强制解包是唯一的解决方案,还是有更好的方法将字符串定义为非可选且“永远不会为零”?
答案 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"
但应尽可能避免强行展开