【问题标题】:Initializer for conditional binding must have Optional type, even if it is a Optional type条件绑定的初始化器必须具有 Optional 类型,即使它是 Optional 类型
【发布时间】: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强制解包?
  • 只有可选的变量被隐式初始化为零:stackoverflow.com/questions/37400196/….
  • @MartinR 谢谢

标签: swift


【解决方案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 }

【讨论】:

    猜你喜欢
    • 2016-06-25
    • 2015-10-19
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2021-04-26
    • 2016-01-27
    相关资源
    最近更新 更多