苹果公司的文件如下:

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

为什么要使用可选值?


当前回答

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

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

其他回答

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

var error: NSError? = nil

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

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

在Swift中,可选类型既可以有值,也可以没有值。可选选项是通过附加?对任何类型:

var name: String?

您可以参考这个链接来深入了解:https://medium.com/@agoiabeladeyemi/ opoptions -in-swift-2b141f12f870

在Swift中,你不能有一个指向nil的变量——既没有指针,也没有空指针。但是在一个API中,你经常希望能够指出一个特定类型的值,或者一个缺乏值的值——例如,我的窗口是否有一个委托,如果有,它是谁?可选的是Swift的类型安全,内存安全的方式来做到这一点。

可选值允许您显示没有值。有点像SQL中的NULL或Objective-C中的NSNull。我想这将是一个改进,因为您甚至可以将其用于“原始”类型。

// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
    case None
    case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)”

摘自:苹果公司《快速编程语言》。“iBooks。https://itun.es/gb/jEUH0.l

可选意味着Swift不能完全确定该值是否与类型对应:例如,Int?这意味着Swift不能完全确定该数字是否是Int类型。

要去除它,可以采用三种方法。

1)如果你绝对确定它的类型,你可以使用感叹号来强制打开它,就像这样:

// Here is an optional variable:

var age: Int?

// Here is how you would force unwrap it:

var unwrappedAge = age!

如果你强制打开一个可选对象并且它等于nil,你可能会遇到这个崩溃错误:

这并不一定是安全的,所以这里有一个方法,可以防止崩溃,如果你不确定类型和值:

方法二和方法三防止了这个问题。

2)隐式解包装可选

 if let unwrappedAge = age {

 // continue in here

 }

注意,展开的类型现在是Int,而不是Int?

3)警卫声明

 guard let unwrappedAge = age else { 
   // continue in here
 }

在这里,您可以继续使用未包装变量。如果您确定变量的类型,请确保仅强制展开(使用!)。

祝你的项目好运!