【问题标题】:Why is the let variable = x syntax not working with the ternary operator?为什么 let variable = x 语法不适用于三元运算符?
【发布时间】:2016-02-14 15:10:25
【问题描述】:

可以通过这种方式隐式展开可选选项。

if let foo = foo {
     print("foo")
} else {
     print("bar")
}

我在 Playground 中练习,我不明白为什么我不能使用三元运算符来完成上述操作。

let foo = foo ? print("foo") : print("bar")

// or

var result:String = (let foo = foo ? print("foo") : print("bar"))

我认为这对于 Swift 来说是完全正常的,尽管很尴尬,因为三元运算会计算为表达式。我怀疑let foo = foo 本身就是 Swift 必须处理的表达式,但它来自像我这样的 Swift 新手。

【问题讨论】:

  • 我相信你的第一个例子叫做Optional Binding。隐式展开是someVar!
  • 而您的第二个示例不起作用的原因是因为您在自己的初始值中使用了foo,因此出现错误:Variable used within its own initial value
  • 无论如何你想用 'let foo = foo' 达到什么目的
  • @Eendje 我在想可选绑定是否适用于三元运算符,truefalse 的结果将被返回/分配。

标签: swift swift2


【解决方案1】:

if let 是一种特殊的 Swift 形式,允许您在解开 Optional 时重新绑定标识符。 let 语句本身不能重新绑定在同一范围内声明的标识符。这是规则。

此外,您不能像使用 BooleanType 一样使用 Optional,而您正在尝试这样做(因为 ?: 的条件必须是 BooleanType)。

还要注意print 返回()(空元组,也称为Void 类型的单例实例)。所以没有理由将foo 重新绑定到print 的返回值。

这行得通,虽然它不是很好的风格:

foo != nil ? print("set") : print("nil")

这是个好风格:

if foo != nil {
    print("set")
} else {
    print("nil")
}

或者这个:

print(foo != nil ? "set" : "nil")

在这种情况下,以下情况更糟,但当您需要转换包装的值(如果设置)并提供默认值(如果为 nil)时,这是一个合理的模式:

print(foo.map { _ in "set" } ?? "nil" )

如果你只是想解开foo以便在函数后面使用,而不增加大括号嵌套级别,可以使用guard

guard let foo = foo else {
    print("nil")
    return // you must return or throw or abort here in a guard statement
}

// Here foo has been rebound and is no longer optional.
print("set to \(foo)")

【讨论】:

    猜你喜欢
    • 2019-05-22
    • 1970-01-01
    • 2017-12-09
    • 2020-07-16
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2013-11-09
    • 2012-10-08
    相关资源
    最近更新 更多