苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含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
其他回答
可选值允许您显示没有值。有点像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
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,这样就可以调度另一个计时器。
一旦你明白了变量处于未定义状态你就可以用它来做任何事情。
在Swift中,你不能有一个指向nil的变量——既没有指针,也没有空指针。但是在一个API中,你经常希望能够指出一个特定类型的值,或者一个缺乏值的值——例如,我的窗口是否有一个委托,如果有,它是谁?可选的是Swift的类型安全,内存安全的方式来做到这一点。
在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
{..}
当我开始学习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。
谢谢你!快乐的编码