gpt4 book ai didi

swift - 为什么 let variable = x 语法不适用于三元运算符?

转载 作者:行者123 更新时间:2023-11-28 12:54:30 25 4
gpt4 key购买 nike

可以通过这种方式隐式解包可选值。

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 新手。

最佳答案

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

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

另请注意,print 返回 ()(空元组,也称为 Void 类型的单例实例)。所以没有理由将 foo 重新绑定(bind)到 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)")

关于swift - 为什么 let variable = x 语法不适用于三元运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35388998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com