苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
当前回答
在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
{..}
其他回答
从https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html:
可选链接是一个查询和调用属性、方法和当前可能为nil的可选对象的下标的过程。如果可选选项包含值,则属性、方法或下标调用成功;如果可选值为nil,则属性、方法或下标调用将返回nil。多个查询可以链接在一起,如果链中的任何链接为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
在Swift中,你不能有一个指向nil的变量——既没有指针,也没有空指针。但是在一个API中,你经常希望能够指出一个特定类型的值,或者一个缺乏值的值——例如,我的窗口是否有一个委托,如果有,它是谁?可选的是Swift的类型安全,内存安全的方式来做到这一点。
让我们以NSError为例,如果没有返回错误,你会想让返回Nil是可选的。如果没有错误,给它赋值是没有意义的。
var error: NSError? = nil
这也允许您拥有一个默认值。因此,如果函数没有传递任何东西,你可以为方法设置一个默认值
func doesntEnterNumber(x: Int? = 5) -> Bool {
if (x == 5){
return true
} else {
return false
}
}
当我开始学习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。
谢谢你!快乐的编码