【问题标题】:Defined a function as returning an optional but its returning a non optional将函数定义为返回可选但返回非可选
【发布时间】:2014-06-18 18:04:53
【问题描述】:

在下面的代码中,为什么 expectingThisToBeOptional 是 String 类型而不是 String 类型!当 getOptional() 返回一个字符串时!

func getOptional() -> String!
{
    var s:String! = "Hello"
    return s
}


if let expectingThisToBeOptional = self.getOptional()
{
      // attempting to use expectingThisToBeOptional! gives error saying type is String not String!
}
else
{
    // why does execution come here when run?
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    if let 语法解包可选; else 块在可选为 nil 时执行。

    此外,使用!(而不是?)定义的选项是“隐式展开”的。这意味着您不需要使用myvar! 语法(强制展开运算符)

    请参阅 this question 了解更多关于可选(例如,String?)和隐式展开的可选(例如,String!)之间的区别

    【讨论】:

    • 问题代码中的 optional 不是 nil,那为什么 else 分支还在执行呢?
    • @Sausages 问题显示的代码不可能是所有有问题的代码 - 例如,该函数是通过引用 self 来调用的。我怀疑在他的实际使用中,该函数(我假设它是一种方法)的代码比我们看到的要多,并且有时会返回 nil。因为从我们可以看到它永远不会执行 else 块。
    【解决方案2】:

    当您使用if let 语句时,您设置的常量包含可选项的展开值(如果它有值)。 self.getOptional() 返回一个 String!,它被解包为 String 并分配给 expectingThisToBeOptional

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 2012-10-07
      • 2015-06-09
      • 1970-01-01
      • 2018-10-30
      • 2019-06-11
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多