当前位置: 首页 > 知识库问答 >
问题:

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

司空凌
2023-03-14

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

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

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

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

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

<代码>如果let childTitle=childTitle{…}

我开始想是否有一种快捷方式或更有效的方式来执行nil检查,其唯一目的是使用现有变量。我想象了这样的事情:

如果让childTitle{…}

这样的事情是否存在,或者至少是我上述两种临时解决方案的替代方案?


共有3个答案

欧阳鸿德
2023-03-14

我已经养成了重新分配到相同名称的习惯。这消除了想出单独名称的需要,并避免了新名称是否应该在任何地方使用的任何混淆。但是,请注意块后的输出:

var test: String? = "123"
if var test = test {
    test += "4"
    test += "5"
}
print(test) // prints "123"

如果需要在块后访问修改后的值,可以将变量指定给新名称,并将新名称重新指定给块内的旧名称:

var test: String? = "123"
if var testWorking = test {
    testWorking += "4"
    testWorking += "5"
    test = testWorking
}
print(test) // prints "12345"
颜镜
2023-03-14

这是我唯一知道的选择。

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

但是childTitle仍然是可选的,所以每次使用它时都必须将其展开:childTitle!。doSomething()。不过,这不应该影响性能。

魏高邈
2023-03-14

不。您应该打开您的选项,只需用您提到的相同名称重新定义它。这样您就不需要创建第二个var。

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

更新:Xcode 7.1.1•Swift 2.1

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

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

    // childTitle it is not nil after the guard statement
    print(childTitle)
}
 类似资料:
  • 问题内容: 当使用可选绑定解开单个方法调用(或长方法调用链的可选链接)时,语法清晰易懂: 但是,当将变量作为参数提供时,我发现自己使用了: 甚至只是用相同的名称重新定义它: 我开始怀疑,是否存在一种快捷方式或更有效地执行检查,其唯一目的是使用现有变量。我曾想过: 是否存在类似的方法,或者至少是上述两种临时解决方案的替代方法? 问题答案: 不。您应该使用与您提到的名称相同的名称重新定义选配项。这样,

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

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

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

  • 问题内容: 我正在使用$ _SESSION变量通过AJAX发送电子邮件(它们需要在不刷新页面的情况下发送),但是$ _SESSION变量不会自动更新,因此当它更改时,我需要刷新页面以更新变量。 是否可以不刷新而更新$ _SESSION变量? 这是我用来发送电子邮件的代码: 因此,基本上,如果$ _SESSION变量更改,则需要此AJAX电子邮件来识别它,而无需刷新。 谢谢你的帮助 问题答案: 当您

  • 此代码在Sass中不起作用: 为什么这不是有效的语法?正确的语法是什么?