苹果公司的文件如下:

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

为什么要使用可选值?


当前回答

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

var name: String?

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

其他回答

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

var lol: Laugh? = nil

等价于Kotlin:

var lol: Laugh? = null

在Java中是这样的:

@Nullable Laugh lol = null;

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

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

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

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

可选意味着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
 }

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

祝你的项目好运!

There are lots of errors which are caused by people trying to use a value which is not set, sometime this can cause a crash, in objective c trying to call the methods of a nil object reference would just be ignored, so some piece of your code not executing and the compiler or written code has no way of telling your why. An optional argument let you have variables that can never be nil, and if you try to do build it the compiler can tell you before your code has even had a chance to run, or you can decide that its appropriate for the object to be undefined, and then the compiler can tell you when you try to write something that doesn't take this into account.

在调用nil对象的情况下,你可以直接

object?.doSomthing()

你已经明确地告诉编译器和任何阅读你代码的人,它的可能对象是nil,什么都不会发生。有时,只有在值存在时才希望出现几行代码,因此可以这样做

if let obj = object {
    obj.doSomthing()
    doSomethingto(obj)
}

这两个语句只会在object是什么东西时执行,简单地说,如果它不是什么东西,你可能想要停止整个代码块的其余部分

guard let obj = object {
    return
}
obj.doSomthing()
doSomethingto(obj)

如果后面的所有内容都只适用于object,那么阅读起来会更简单,另一种可能是你想使用默认值

let obj = object ?? <default-object>
obj.doSomthing()
doSomethingto(obj)

现在obj将被赋值给某个对象,即使它是该类型的默认值

选项是有用的情况下一个值可能不会获得一个值,直到一些事件发生或您可以使用一个选项设置为零,以说它不再相关的或者需要设置和使用的一切它没有做任何与它,直到它是集,我喜欢用可选的方法之一是告诉我必须做点什么或者已经完成

func eventFired() {
    guard timer == nil else { return }
    timer = scheduleTimerToCall(method, in: 60)
}

func method() {
    doSomthing()
    timer = nil
}

这个sudo代码可以多次调用eventFired,但只有在第一次调用时才会调度一个计时器,一旦调度执行,它会运行一些方法并将计时器设置为nil,这样就可以调度另一个计时器。

一旦你明白了变量处于未定义状态你就可以用它来做任何事情。