gpt4 book ai didi

swift - 为什么不将 LET 用作可选项会引发错误,因为它是与零的隐式比较 - Swift 介绍书中的不一致?

转载 作者:搜寻专家 更新时间:2023-11-01 05:54:29 24 4
gpt4 key购买 nike

我正在通读 Swift 文档,并挂断了我认为文档中存在的不一致之处。

引用 1 - 控制流部分

In an if statement, the conditional must be a Boolean expression--this means that code such as if score { ... } is an error, not an implicit comparison to zero.

因此,严格的“ bool 值”要么为 TRUE,要么为 FALSE。

引用 2 - 控制流部分

You can use if and let together to work with values that might be missing. These values are represented as optionals. An optional value either contains a value or contains nil to indicate that the value is missing. Write a question mark (?) after the type of a value to mark the value as optional

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}

if the optional value is nil, the conditional is false

因此,“ bool 值”似乎意味着“真实/虚假”,因为 nil 隐含地意味着 false

and the code in braces is skipped. Otherwise, the optional value is unwrapped and assigned to the constant after let, which makes the unwrapped value available inside the block of code.

所以这是我看到不一致的地方。在上面的代码示例中,由于 optionalName 有一个值,因此 name 变量被赋值为“John Appleseed”。

所以在比较中,我们最终得到了一个NON-BOOLEAN EXPRESSION;具体来说,“John Appleseed”。这是“真实的”,但不是 bool 值,这与第 1 点相矛盾!

换句话说——在代码中——在 let 中赋值后,我们有:

if "John Appleseed" {
greeting = "Hello, \(name)"
}

根据引用 1,这应该会引发错误,因为它不是 bool 表达式。

最佳答案

你是对的,它不一致,它不应该提到 bool 表达式,而是一个逻辑值。这是Language Reference关于if:

The value of any condition in an if statement must have a type that conforms to the LogicValue protocol. The condition can also be an optional binding declaration, as discussed in Optional Binding.

请注意,这里的可选绑定(bind)被视为表达式。它不是 if 中的赋值,就像在 C 中一样。它只是 if 语句的一个特例,当绑定(bind)值不是零。

这些在 Swift 中都无效:

x = y = 10 // () is not convertible to Int
if z = optional { } // type () does not conform to LogicValue
if let z = optional && z > 5 { } // bound value must be of Optional type
if (let z = optional) && z > 5 { } // pattern variable binding cannot appear in expression

编辑:
起初我的回答是“赋值不是 Swift 中的表达式”,但从技术上讲这是不正确的。赋值是一个表达式,但属于 () 类型,又名 Void。这是有效的 Swift:

var v = ()
var x = 0

v = x = 10 // x = 10; v = ()

编辑2:只是为了清楚地说明这一点,当您使用 if letif var 时,它不是对现有变量的赋值,而是一个新变量/引入了范围在 if block 内部的常量:

var x = 0
var y : Int? = 10
if var x = y { // new variable x is introduced
println(x) // prints 10
x = 20 // neither affects y nor 'outer' x
}
if let x = y { // new constant x is introduced
println(x) // prints 10
}
if let y = y { // introduce new y shadowing the original
println(y) // prints 10
}
println(x) // prints 0

//if x = y { } // does not compile

关于swift - 为什么不将 LET 用作可选项会引发错误,因为它是与零的隐式比较 - Swift 介绍书中的不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807286/

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