代码之家  ›  专栏  ›  技术社区  ›  timbre timbre

避免将字符串视为swift中的可选字符串

  •  0
  • timbre timbre  · 技术社区  · 6 年前

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

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

    所以字符串不可能是 nil .但是,当我尝试使用 str 斯威夫特仍然认为这是可选的。例如:

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

    将返回编译器错误:

    可选类型“string?”的值必须展开为“string”类型的值

    问题是,我使用这个函数很多次,并且 str ?? "N/A" 任何时候都没有意义。强制打开 str! 似乎有点过头了:这个字符串对应用程序来说并不重要,所以我认为如果缺少它就中止执行没有任何意义。

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

    3 回复  |  直到 6 年前
        1
  •  4
  •   Craig Siemens    6 年前

    问题是 dict[index] 仍返回可选的,因此 str 必须是可选的。有两种方法可以修复它

    可以使用nil合并运算符 DICT[索引] 如果不为零,则使用“不适用”

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

    另一个选项是使用字典默认值下标

    let str = dict[index, default: "N/A"]
    
        2
  •  3
  •   Dávid Pásztor    6 年前

    在定义 str 本身。检查值是否为零,然后在不展开的情况下仍然分配可选值是没有意义的。

    let str = dict[index] ?? "N/A"
    
        3
  •  1
  •   Aakash    6 年前

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

    而不是 let str = (nil != dict[index]) ? dict[index] : "N/A"

    因为str在您的案例中仍然是可选的,原因是 dict[index] 是可选的,即使您正在检查它是否为零。那么,Swift推断str的类型是字符串?

    你也可以强制打开,因为你已经在检查它是否为零,就像- let str = (nil != dict[index]) ? dict[index]! : "N/A"

    但应尽可能避免强行拆解。