?含义
Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。
Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:
var optionalInteger: Int?
var optionalInteger: Optional<Int>
当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。
如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值,如下所示
optionalInteger = 88
optionalInteger! // 88
注意:使用操作符!去获取值为nil的可选变量会有运行时错误。
可选类型类似于Objective-C中指针的nil值,但是nil只对类(class)有用,而可选类型对所有的类型都可用,并且更安全。
!含义
!当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。表示“我知道这个可选类型有值,请使用它” ,或者可以理解为可选值的强制解析
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
print(myString)
}else{
print("myString 值为 nil")
}
//以上程序执行结果为:
//Optional("Hello, Swift!")
强制解析可选值,使用感叹号(!):
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil {
// 强制解析
print( myString! )
}else{
print("myString 值为 nil")
}
//程序执行结果:
//Hello, Swift!
注意:使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。
as ,as?,as!
as:
- 从派生类转换为基类,向上转型(upcasts)
// 定义人员基类
class Person {
var name : String
init(_ name: String){
self.name = name
}
}
// 定义学生类
class Student : Person {
}
// 定义教师类
class Teacher : Person {
}
// 处理人员对象的函数(或工厂模式处理操作等)
func showPersonName(_ people : Person){
let name = people.name
print("这个人的名字是: \(name)")
}
// 定义一个学生对象 tom
var tom = Student("Tom");
// 定义一个教师对象 kevin
var kevin = Student("Kevin Jakson");
// 先把学生对象向上转型为一般的人员对象
let person1 = tom as Person
let person2 = kevin as Person
// 再调用通用的处理人员对象的showPersonName函数
showPersonName(person1)
showPersonName(person2)
- 消除二义性,数值类型转换
let age = 28 as Int
let money = 20 as CGFloat
let cost = (50 / 2) as Double
- switch 语句中进行模式匹配,通过switch语法检测对象的类型,根据对象类型进行处理。
switch person1 {
case let person1 as Student:
print("是Student类型,打印学生成绩单...")
case let person1 as Teacher:
print("是Teacher类型,打印老师工资单...")
default: break
}
as!
向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
let person : Person = Teacher("Jimmy Lee")
let jimmy = person as! Teacher
as?
as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值。由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?
let person : Person = Teacher("Jimmy Lee")
if let someone = person as? Teacher{
print("这个人是教师, 名字是 \(someone.name)")
} else {
print("这个人不是教师, 'tom'的值是 nil")
}
网友评论