苹果公司的文件如下:

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

为什么要使用可选值?


当前回答

在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

我做了一个简短的回答,总结了上面的大部分内容,以清除我作为初学者脑海中的不确定性:

与Objective-C相反,在Swift中没有变量可以包含nil,所以增加了Optional变量类型(变量以"?"结尾):

    var aString = nil //error

最大的区别是可选变量不直接存储值(像普通的Obj-C变量一样),它们包含两种状态:“有值”或“有nil”:

    var aString: String? = "Hello, World!"
    aString = nil //correct, now it contains the state "has nil"

也就是说,你可以在不同的情况下检查这些变量:

if let myString = aString? {
     println(myString)
}
else { 
     println("It's nil") // this will print in our case
}

通过使用"!"后缀,您还可以访问包含在其中的值,前提是这些值存在。(即它不是nil):

let aString: String? = "Hello, World!"
// var anotherString: String = aString //error
var anotherString: String = aString!

println(anotherString) //it will print "Hello, World!"

这就是为什么您需要使用“?”和“!”,而不是默认情况下全部使用它们。(这是我最大的困惑)

我也同意上面的回答:可选类型不能用作布尔类型。

可选值允许您显示没有值。有点像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时,很难意识到为什么是可选的。

让我们这样想。 让我们考虑一个类Person,它有两个属性名和公司。

class Person: NSObject {
    
    var name : String //Person must have a value so its no marked as optional
    var companyName : String? ///Company is optional as a person can be unemployed that is nil value is possible
    
    init(name:String,company:String?) {
        
        self.name = name
        self.companyName = company
        
    }
}

现在让我们创建Person的几个对象

var tom:Person = Person.init(name: "Tom", company: "Apple")//posible
var bob:Person = Person.init(name: "Bob", company:nil) // also Possible because company is marked as optional so we can give Nil

但是我们不能将Nil传递给name

var personWithNoName:Person = Person.init(name: nil, company: nil)

现在我们来谈谈为什么我们用optional? 让我们考虑这样一种情况,我们想在公司名称后面加上Inc,比如apple将是apple Inc。我们需要在公司名称和打印后附加Inc。

print(tom.companyName+" Inc") ///Error saying optional is not unwrapped.
print(tom.companyName!+" Inc") ///Error Gone..we have forcefully unwrap it which is wrong approach..Will look in Next line
print(bob.companyName!+" Inc") ///Crash!!!because bob has no company and nil can be unwrapped.

现在让我们来研究一下为什么会出现“可选”。

if let companyString:String = bob.companyName{///Compiler safely unwrap company if not nil.If nil,no unwrap.
    
    print(companyString+" Inc") //Will never executed and no crash!!!
}

咱们把鲍勃换成汤姆吧

if let companyString:String = tom.companyName{///Compiler safely unwrap company if not nil.If nil,no unwrap.
    
    print(companyString+" Inc") //Will executed and no crash!!!
}

和祝贺!我们是否妥善处理可选事宜?

实现要点是

如果一个变量可能为nil,我们将其标记为可选 如果我们想在代码的某个地方使用这个变量,编译器将 提醒你们一下,我们需要检查一下我们是否正确地处理了这个变量 如果它包含nil。

谢谢你!快乐的编码

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

var lol: Laugh? = nil

等价于Kotlin:

var lol: Laugh? = null

在Java中是这样的:

@Nullable Laugh lol = null;

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