【问题标题】:Optional Type 'String??' Not Unwrapped可选类型“字符串??”未展开
【发布时间】:2015-10-30 09:26:45
【问题描述】:

“可选类型'String??'的值没有打开;你是不是要使用“!”要么 '?'?” -

我今天遇到了这个奇怪的编译器错误,由于String 后面的两个问号,这完全令人困惑。

我有一个字典s,类型为[String : String?],还有一个函数接受所有参数为String?s。具体来说(来自 5813 的 method 将用户选择的信息复制到字典中),我有以下的详细版本:

func combine(firstname: String?, lastname: String?) {...}

var text = combine(s["kABPersonFirstNameProperty"], lastname: s["kABPersonLastNameProperty"])

我在第二行收到错误,我想知道为什么会这样。如果s 中的值是String? 类型,那么combine() 不应该接受吗,因为它的参数应该是相同的类型?那么,为什么我会收到此错误,我该如何解决?

【问题讨论】:

    标签: ios swift dictionary optional optional-parameters


    【解决方案1】:

    Dictionary<T1, T2>[key] 返回T2?。这是在 key 不存在的情况下返回 nil。

    所以如果 T2 是 String?s[key] 返回 String?? 您不能将String?? 传递为String?

    您也可以这样调用来解包并准备不存在的密钥

    var text = combine(s["kABPersonFirstNameProperty"] ?? nil, lastname: s["kABPersonLastNameProperty"] ?? nil)
    

    顺便说一句,下面的代码不会将值设置为 nil,而是从字典中删除整个条目

    s[key] = nil
    

    如果您希望该值为 nil 而不是删除条目,则必须这样做

    s[key] = nil as String?
    

    【讨论】:

    • 您好,感谢您的意见。那么,我能做些什么来解决这个问题呢?
    • 当我尝试as String? 时,我收到一条消息,上面写着“'String??'不能转换为 'String?'"。
    • 请再次查看我修改后的答案:)
    【解决方案2】:

    它曾经是可选的,因为您的字典值是可选的。它又是可选的,因为 dictionary[key] 返回可选的。所以你需要解开它两次。

    在游乐场尝试这个以了解问题(并查看可能的解决方案):

    let oos: String?? = "Hello"
    print(oos)
    
    if let os = oos { // Make String?
        print(os)
        if let s = os { // Make ordinary String
            print(s)
        }
    }
    

    打印:

     Optional(Optional("Hello"))
    
     Optional("Hello")
    
     Hello
    

    但您也可以使用除 if let 之外的其他方式展开。例如:

     print(oos! ?? "n/a")
    

    将强制解包一次,然后打印内部字符串或 n/a 以防 nil...

    【讨论】:

    • 嗨 MirekE,感谢您的快速回复。字典的值有时会是nil,那么我应该使用什么标记,在哪里使用?我无法使用!,因为它可能没有值,我尝试了s[key]??,但又遇到了另一个错误。
    • 有很多选项,例如可以使用if let两次。
    【解决方案3】:

    也许最简单的解决方案是让字典保存String 而不是String?。这样您就不会遇到其他解决方案中描述的展开问题。

    或者你真的需要存储String? 类型吗? 您想区分“密钥存在但持有 nil”和“密钥不存在”吗?

    【讨论】:

    • 有时需要为“值不存在”和“nil值存在”提供不同的逻辑含义
    • @hebinda:当然,但这应该是一个明确的决定。我的印象是@Randoms 真的想要[String : String] 而不是[String : String?]
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2016-04-24
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多