Swift Optionals -条件中的变量绑定需要初始化器

btxsgosb  于 2023-05-28  发布在  Swift
关注(0)|答案(6)|浏览(198)

我是Swift的新手,正试图弄清楚Optional的概念。我在Playground中有一小段代码,它给了我“条件中的变量绑定需要初始化器”错误。有人能解释一下为什么以及如何解决这个问题吗?
我只想打印“Yes”或“No”,这取决于“score1”是否有值。下面是代码:

import Cocoa

class Person {
    var score1: Int? = 9

    func sum() {
        if let score1 {
            print("yes")
        } else {
            print("No")
        }
    }//end sum
 }// end person

 var objperson = person()
 objperson.sum()
x33g5p2x

x33g5p2x1#

if let语句接受一个可选变量。如果它是nil,则执行else块或nothing。如果它有一个值,则该值将作为非可选类型分配给其他变量。
因此,下面的代码将输出score1的值,如果没有,则输出“No”:

if let score1Unwrapped = score1
{
    print(score1Unwrapped)

}

else
{
    print("No")
}

相同的较短版本将是:

print(score1 ?? "No")

在你的例子中,你实际上没有使用存储在可选变量中的值,你也可以检查值是否为nil:

if score1 != nil {
...
}
3wabscal

3wabscal2#

写作

if let score1 {

这说不通啊如果想查看score是否有值,请使用

if score1 != nil {

if let score = score1 {

最后一种情况将一个新的非可选常量score绑定到score1。这允许您在if语句中使用score

7eumitmz

7eumitmz3#

你问题中的代码与我在Swift书籍和文档中看到的类似,它们是正确的。
你的playground使用的是旧版本的swift,目前不支持这种语法。使用XCode的beta版本应该可以修复
https://www.reddit.com/r/swift/comments/vy7jhx/unwrapping_optionals/

wfauudbj

wfauudbj4#

问题是if let假设你想创建一个有某个值的常量score1。如果你只是想检查它是否包含一个值,就像在不是nil中一样,你应该像下面这样做:

if score1! != nil {
     // println("yes")

所以你的完整代码看起来像这样:

class Person {
    var score1: Int? = 9

    func sum() {
        if score1 != nil {
            println("yes")
        }
        else {
            println("no")
        }
    }
}

var objperson = Person()
objperson.sum()
0yycz8jy

0yycz8jy5#

问题中的语法自问题第一次发布以来就已成为有效的Swift(如评论中所述)。
在控制流检查表中,可选绑定使用与声明相同的语法(使用letvar),尽管语义略有不同:表达式的类型必须Optional,如果值是nil,检查表将立即短路,如果值不是nil,则值将隐式展开。
注意:支持解构。每个表达式都必须是Optional(才能编译),如果任何值是nil,检查表就会短路。
由于直接重用(通过重新声明)Swift中的变量非常常见,因此可以使用简写let foo(或var foo)(在检查表中)代替let foo = foo(或var foo = foo)。

vjrehmav

vjrehmav6#

您可以使用以下命令展开它:

import Cocoa

class Person {
    var score1: Int? = 9

    func sum() {
        print("\(score1 != nil ? "YES" : "NO")")
    }
 }

然后这样称呼它:

var objperson = Person()
 objperson.sum()

相关问题