苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
苹果公司的文件如下:
您可以一起使用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
其他回答
下面是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
嗯…
? (可选)表示您的变量可能包含nil值,而!(unwrapper)表示在运行时使用变量(试图从中获取值)时,变量必须具有内存(或值)。
主要的区别是,当可选对象为nil时,可选链接会优雅地失败,而当可选对象为nil时,强制展开会触发一个运行时错误。
为了反映可选链接可以在nil值上调用的事实,可选链接调用的结果总是一个可选值,即使您正在查询的属性、方法或下标返回一个非可选值。你可以使用这个可选的返回值来检查可选的链接调用是否成功(返回的可选值包含一个值),或者由于链中的nil值而不成功(返回的可选值为nil)。
具体来说,可选链接调用的结果与预期返回值的类型相同,但包装在可选类型中。一个属性,通常返回一个Int将返回一个Int?当通过可选链接访问时。
var defaultNil : Int? // declared variable with default nil value
println(defaultNil) >> nil
var canBeNil : Int? = 4
println(canBeNil) >> optional(4)
canBeNil = nil
println(canBeNil) >> nil
println(canBeNil!) >> // Here nil optional variable is being unwrapped using ! mark (symbol), that will show runtime error. Because a nil optional is being tried to get value using unwrapper
var canNotBeNil : Int! = 4
print(canNotBeNil) >> 4
var cantBeNil : Int = 4
cantBeNil = nil // can't do this as it's not optional and show a compile time error
以下是苹果开发者委员会提供的基本教程:可选链接
从https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html:
可选链接是一个查询和调用属性、方法和当前可能为nil的可选对象的下标的过程。如果可选选项包含值,则属性、方法或下标调用成功;如果可选值为nil,则属性、方法或下标调用将返回nil。多个查询可以链接在一起,如果链中的任何链接为nil,整个链就会优雅地失败。
要更深入地了解,请阅读上面的链接。
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,这样就可以调度另一个计时器。
一旦你明白了变量处于未定义状态你就可以用它来做任何事情。
让我们以NSError为例,如果没有返回错误,你会想让返回Nil是可选的。如果没有错误,给它赋值是没有意义的。
var error: NSError? = nil
这也允许您拥有一个默认值。因此,如果函数没有传递任何东西,你可以为方法设置一个默认值
func doesntEnterNumber(x: Int? = 5) -> Bool {
if (x == 5){
return true
} else {
return false
}
}