苹果公司的文件如下:

您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。

为什么要使用可选值?


当前回答

这很简单。可选(在Swift中)意味着变量/常数可以为空。你可以看到Kotlin语言实现了同样的事情,但从未将其称为“可选”。例如:

var lol: Laugh? = nil

等价于Kotlin:

var lol: Laugh? = null

在Java中是这样的:

@Nullable Laugh lol = null;

在第一个例子中,如果您没有在对象类型前面使用?符号,那么就会出现错误。因为问号意味着变量/常数可以为空,因此被称为可选的。

其他回答

让我们实验下面的代码游乐场。我希望能明确什么是可选的和使用它的原因。

var sampleString: String? ///Optional, Possible to be nil

sampleString = nil ////perfactly valid as its optional

sampleString = "some value"  //Will hold the value

if let value = sampleString{ /// the sampleString is placed into value with auto force upwraped.

    print(value+value)  ////Sample String merged into Two
}

sampleString = nil // value is nil and the

if let value = sampleString{

    print(value + value)  ///Will Not execute and safe for nil checking
}

//   print(sampleString! + sampleString!)  //this line Will crash as + operator can not add nil

在objective C中,没有值的变量等于“nil”(也可以使用与0和false相同的“nil”值),因此可以在条件语句中使用变量(有值的变量与“TRUE”相同,而那些没有值的变量等于“false”)。

Swift通过提供“可选值”来提供类型安全。即,它可以防止因分配不同类型的变量而形成错误。

所以在Swift中,只有条件语句可以提供布尔值。

var hw = "Hello World"

这里,虽然'hw'是一个字符串,但它不能像objective - C那样在if语句中使用。

//This is an error

if hw

 {..}

为此,它需要被创建为,

var nhw : String? = "Hello World"

//This is correct

if nhw

 {..}

让我们以NSError为例,如果没有返回错误,你会想让返回Nil是可选的。如果没有错误,给它赋值是没有意义的。

var error: NSError? = nil

这也允许您拥有一个默认值。因此,如果函数没有传递任何东西,你可以为方法设置一个默认值

func doesntEnterNumber(x: Int? = 5) -> Bool {
    if (x == 5){
        return true
    } else {
        return false
    }
}

从https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html:

可选链接是一个查询和调用属性、方法和当前可能为nil的可选对象的下标的过程。如果可选选项包含值,则属性、方法或下标调用成功;如果可选值为nil,则属性、方法或下标调用将返回nil。多个查询可以链接在一起,如果链中的任何链接为nil,整个链就会优雅地失败。

要更深入地了解,请阅读上面的链接。

下面是Swift中等价的可选声明:

var middleName: String?

这个声明创建了一个名为midlename的String类型变量。String变量类型后面的问号(?)表示middleame变量可以包含String或nil值。看过这段代码的人都知道middleame可以是nil。这是自我记录!

如果你没有为一个可选的常量或变量指定一个初始值(如上所示),这个值会自动为你设置为nil。如果你愿意,你可以显式地将初始值设置为nil:

var middleName: String? = nil

有关可选选项的更多详细信息,请阅读下面的链接

http://www.iphonelife.com/blog/31369/swift-101-working-swifts-new-optional-values