苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
苹果公司的文件如下:
您可以一起使用if和let来处理可能丢失的值。这些值表示为可选项。可选值要么包含值,要么包含nil,表示该值缺失。在值的类型后面写一个问号(?),将该值标记为可选值。
为什么要使用可选值?
当前回答
在Swift中,你不能有一个指向nil的变量——既没有指针,也没有空指针。但是在一个API中,你经常希望能够指出一个特定类型的值,或者一个缺乏值的值——例如,我的窗口是否有一个委托,如果有,它是谁?可选的是Swift的类型安全,内存安全的方式来做到这一点。
其他回答
可选意味着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
}
在这里,您可以继续使用未包装变量。如果您确定变量的类型,请确保仅强制展开(使用!)。
祝你的项目好运!
在Swift中,你不能有一个指向nil的变量——既没有指针,也没有空指针。但是在一个API中,你经常希望能够指出一个特定类型的值,或者一个缺乏值的值——例如,我的窗口是否有一个委托,如果有,它是谁?可选的是Swift的类型安全,内存安全的方式来做到这一点。
这很简单。可选(在Swift中)意味着变量/常数可以为空。你可以看到Kotlin语言实现了同样的事情,但从未将其称为“可选”。例如:
var lol: Laugh? = nil
等价于Kotlin:
var lol: Laugh? = null
在Java中是这样的:
@Nullable Laugh lol = null;
在第一个例子中,如果您没有在对象类型前面使用?符号,那么就会出现错误。因为问号意味着变量/常数可以为空,因此被称为可选的。
从https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html:
可选链接是一个查询和调用属性、方法和当前可能为nil的可选对象的下标的过程。如果可选选项包含值,则属性、方法或下标调用成功;如果可选值为nil,则属性、方法或下标调用将返回nil。多个查询可以链接在一起,如果链中的任何链接为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