当前位置: 首页 > 面试题库 >

展开Swift可选,无需重新分配变量

金慈
2023-03-14
问题内容

当使用可选绑定解开单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂:

if let childTitle = theItem.getChildItem()?.getTitle() {
    ...
}

但是,当将变量作为参数提供时,我发现自己使用了:

func someFunction(childTitle: String?) {
    if let theChildTitle = childTitle {
        ...
    }
}

甚至只是用相同的名称重新定义它:

if let childTitle = childTitle { ... }

我开始怀疑,是否存在一种快捷方式或更有效地执行nil检查,其唯一目的是使用现有变量。我曾想过:

if let childTitle { ... }

是否存在类似的方法,或者至少是上述两种临时解决方案的替代方法?


问题答案:

不。您应该使用与您提到的名称相同的名称重新定义选配项。这样,您无需创建第二个变量。

func someFunction(childTitle: String?) {
    if let childTitle = childTitle {
        ...
    }
}

更新: Xcode 7.1.1•Swift 2.1

您还可以按如下方式使用防护:

func someFunction(childTitle: String?) {
    guard let childTitle = childTitle else {
        return
    }

    // childTitle it is not nil after the guard statement
    print(childTitle)
}


 类似资料:
  • 使用可选绑定展开单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂: 但是,当提供变量作为参数时,我发现自己使用: 甚至只是用相同的名字重新定义它: <代码>如果let childTitle=childTitle{…} 我开始想是否有一种快捷方式或更有效的方式来执行检查,其唯一目的是使用现有变量。我想象了这样的事情:

  • 问题内容: 在Xcode 8发行版中,我发现了一个奇怪的场景。 这是代码, 结果如下: 上面的这些表明,当我为没有显式类型的变量分配一个 隐式解包的optional时 ,该类型将被推断为一个可选类型,而不是它最初的类型,也就是 隐式解开的optional 。 我的Xcode已更新至8。任何人都可以验证Xcode 7.x中的行为吗? 更改是由于Swift版本更改还是Xcode? 问题答案: 这是SE

  • 问题内容: 为什么无法对隐式解包的可选变量进行突变? 这是一个重现问题的简短示例: 带整数 问题答案: 更新: Xcode Beta 5中的一个小警告已解决此问题: 该数组可以按预期工作,但是现在看来整数仍然需要显式拆包以允许使用 当前,这仅仅是Optionals的本质(无论是否隐式解包)。unwrap运算符返回一个不变的值。这可能是固定的,或者将来会提供更好的解决方案。 目前唯一的解决方法是将数

  • 问题内容: 假设我们定义了一个可选数组: 我可以在短时间内强行打开包装: 但这会使应用程序崩溃,是否还有其他短途方法(无需显式展开)如何展开可选数组? 问题答案: 此解决方案将为您提供一个新数组,其中所有值均已解包且所有nil均被滤除。 Swift 4.1: Swift 2.0: Swift 1.0:

  • 所以我问了这个问题,看起来原因是 之所以不起作用,是因为操作符采用了inout参数,而隐式取消包装的选项不是。然而,在 操作符与隐式unwrapped选项一起工作,这意味着二进制操作符不需要inout参数。所以我的问题是,为什么一元运算符和二元运算符有不同的参数要求?对我来说,能够使用Int似乎有点傻

  • 问题内容: 我在Swift中使用可选字典发现了一些令人惊讶的行为。 我已经做了很多事情,试图找出我可能会缺少的东西,但是除了使字典不是可选的以外,似乎没有什么能使此代码正常工作。我想念什么? 我能得到的最接近的是以下内容,但它当然是荒谬的。 问题答案: 灯泡时刻是您意识到可选词典不是词典的时候。可选的东西不是那个东西!这是一个可选的!仅此而已。可选本身是一种类型。Optional只是一个枚举,包装