条件绑定的初始化器必须具有 Optional 类型,即使它是 Optional 类型

Posted

技术标签:

【中文标题】条件绑定的初始化器必须具有 Optional 类型,即使它是 Optional 类型【英文标题】:Initializer for conditional binding must have Optional type, even if it is a Optional type 【发布时间】:2019-02-11 09:37:56 【问题描述】:

我遇到了一个我不理解的错误,因为我以为我理解了展开条件 var/let。但是当我尝试强制打开它时,如果我收到提供的错误。

错误:

Initializer for conditional binding must have Optional type, not 'String'  

代码:

let imNotSet: String?

print(type(of: imNotSet)) // Optional<String>

if let unwrappedVar = imNotSet!  // error on this line
    print(unwrappedVar)

【问题讨论】:

去掉感叹号... 删除! 你已经强制在那里解包 但是我得到了我期望的错误“在初始化之前使用常量'imNotSet'”,所以你不能使用let强制解包? 只有可选的变量被隐式初始化为零:***.com/questions/37400196/…. @MartinR 谢谢 【参考方案1】:
if let unwrappedVar = imNotSet!  // error on this line
    print(unwrappedVar)

imNotSet! 强制解包 imNotSet。所以它不再是一个可选的,而是一个字符串。

要保持它是可选的,请移除强制展开。

if let unwrappedVar = imNotSet  // error fixed
        print(unwrappedVar)
    

if let 允许您安全地解开可选项,这与您之前所做的强制解开不同。

至于Constant 'imNotSet' used before being initialized 错误,如果它确实是一个常量,请在使用之前提供一个类似let imNotSet: String? = "Sample" 的值。或者,如果您以后需要像var imNotSet: String? = nil 那样重置它,则将其设为 var

【讨论】:

那么当我使用imNotSet 作为常量时,它是如何工作的?现在我收到错误Constant 'imNotSet' used before being initialized @BjörnHjorth 如果在使用前它确实是一个常量,请提供一个值let imNotSet: String? = "Sample",或者如果您稍后需要重置它,则将其设置为 var var imNotSet: String? = nil 所以无法对这种情况进行检查:它是 nil 还是常量值? 差不多。正如马丁所说,可选常量不会自动默认为零。由于您可能需要更改值,因此无论如何都应该使用 var 而不是 let【参考方案2】:

与 if let 一起使用的 var 必须是 可选 和 this

imNotSet!

不是,所以替换

if let unwrappedVar = imNotSet! 

guard let unwrappedVar = imNotSet else  return 

【讨论】:

以上是关于条件绑定的初始化器必须具有 Optional 类型,即使它是 Optional 类型的主要内容,如果未能解决你的问题,请参考以下文章

条件绑定的初始化程序必须具有 Optional 类型,而不是 '() -> Data?'

条件绑定的初始化程序必须具有Optional类型,而不是'String'

条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型

条件绑定:if let error - 条件绑定的初始化程序必须具有可选类型

用于条件绑定的 Swift Initializer 必须具有 Optional 类型,而不是 '[AVCaptureDevice]'

如何修复条件绑定的初始化程序必须具有可选类型,而不是“字符串”? [复制]