条件绑定的初始化器必须具有 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]'