?和!表示Optional类型,即可选类型,使用可选类型(optionals)来处理值可能缺失的情况
可选类型表示:
- 有值,等于 x
或者 - 没有值
注意:
C 和 Objective-C 中并没有可选类型这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回nil,nil表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选类型可以让你暗示任意类型的值缺失,并不需要一个特殊值。
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
因为该构造器可能会失败,所以它返回一个可选类型(optional)Int,而不是一个 Int。一个可选的 Int 被写作 Int? 而不是 Int。问号暗示包含的值是可选类型,也就是说可能包含 Int 值也可能不包含值。(不能包含其他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都没有。)
nil
你可以给可选变量赋值为nil来表示它没有值:
var serverResponseCode: Int? = 404
// serverResponseCode 包含一个可选的 Int 值 404
serverResponseCode = nil
// serverResponseCode 现在不包含值
注意:
nil不能用于非可选的常量和变量。如果你的代码中有常量或者变量需要处理值缺失的情况,请把它们声明成对应的可选类型。
如果你声明一个可选常量或者变量但是没有赋值,它们会自动被设置为 nil:
var surveyAnswer: String?
// surveyAnswer 被自动设置为 nil
注意:
Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。
?
- 声明变量时
var gradeArray:[String]?
var gradeArray:[String]?表示声明了一个Optional类型,这个类型可能为数组,也可能为其他类型。
由var gradeArray:[String]?可知,没有对gradeArray手动初始化,系统就会自动将gradeArray初始化值为nil,类似于var gradeArray:[String]? = nil;
拓展:没有?的情况 var gradeArray:[String],系统不会自动初始化值为nil,因此如果紧接着执行var newArray = gradeArray的话,就会报gradeArray没有进行初始化的错误。
- 操作变量时
var gradeArray:[String]? // 表示声明了一个Optional类型,可能为数组
gradeArray = ["A","B","C","D"]// set方法赋值
print("gradeArray为", gradeArray?[2]) // 打印C
gradeArray?[2]操作变量时,这里使用的是?。如果gradeArray为nil,就不解包执行后面的[2],所以无论如何程序都不会crash。
!
- 声明变量时
var gradeArray:[String]!和var gradeArray:[String]?是一样的,在操作变量时才会有区别
- 操作变量时
var gradeArray:[String]! // 表示声明了一个Optional类型,可能为数组
print("gradeArray为", gradeArray![2]) // 报错
var newGradeArray:[String]! // 表示声明了一个Optional类型,可能为数组
newGradeArray = ["A","B","C","D"]// set方法赋值
print("newGradeArray为", newGradeArray![2]) // 打印C
?和!开发中虽然都会用到,都能实现同等的功能,但是尽量都用?。因为?并不像!那样会强制解包,稍微不注意,程序就会崩溃,所以!了解了解就行。
网友评论