一.可选和nil
1.在任何类型的后面紧跟?即可表示它是可选类型。可选类型的变量可以用来处理“值缺失”的情况。
2.先看一个简单的例子:
var str = "abcdef"
var num : int = str.toInt();
由于str转换为Int时有可能会失败,故num可能会没有值,因此不能用Int类型来声明num,应该用可选类型。如下:
var num : Int? = str.toInt();
如果str的值是“123”,则会转成功,像这里则会转失败。转换失败时就是值缺失的情况,Swift使用nil来代表“值缺失”的情况。
3.Swift中的nil与Object-C中的nil是完全不同的。在Object-C中,nil代表一个并不存在的对象的指针。而在Swift中,nil并不代表指针,它是一个确定的值,用于表示“值缺失”,任何类型的值都可以被赋值为nil。
4.只有可选类型的变量或者常量才能接受nil。其他类型的变量或常量不能接受nil。
5.如果声明的一个可选类型的变量或者常量没有指定初始值,它将会自动设置为nil。
举个栗子:var name : String?;
6.可选类型是Swift中的新特性,C语言和Object-C中没有的。
二.强制解析
1. Int类型和Int?类型并不是相同的类型,程序不能直接把Int?类型的变量或常量当成Int类型来使用。
2.为了获取可选类型的变量或常量中实际存储的值,可在变量和常量后添加英文感叹号!。这种添加感叹号进行解析的用法被称为强制解析(forced unwrapping)。
3.这个感叹号表示:已知该可选变量有值,请读取其中的值。
举个栗子:var str : String? = "abcedf"
var s : String = str----这是错误的。
var s : String = str!----对可选类型进行强制解析,正确。
4.需要注意的是:Swift的强制解析是有前提的,即可选类型的变量或常量必须有值时才能解析成功,否则将会导致运行错误。
因此,在进行强制解析时,建议用if语句判断可选类型是否有值。举个栗子:
var str : String? = "abcdef"
if str != nil
{
var s = str!
}else{
print("str为nil,不能进行强制解析")
}
三.可选绑定
1.可选绑定用于判断可选类型的变量或常量是否有值,如果可选类型的变量或常量有值就赋值给另一个临时变量。可选绑定用在if分支或
while循环中对可选类型的值进行判断。举个栗子:
var str : String? = "abcdef"
if var tmp = str----此处不需要感叹号
{
print(tmp)
}else{
print("str的值为nil,不能进行解析")
}
2.可选绑定支持变量,也支持常量。要使用常量时,将关键字var改为let即可。
四.隐式可选类型
1.除了在任意的已有类型后添加?来表示可选类型外,Swift中还可以在任意的已有类型后添加感叹号!来表示可选类型。---可选类型的另一种写法。
2.比如:Int类型的变量,只能接受Int型的值;
Int?类型的变量既可以接受Int型的值,也可以接受nil;
Int!类型的变量既可以接受Int型的值,也可以接受nil。
3. Int?和Int!类型的区别:当程序要获取可选类型变量的值的时候:对于Int?要进行强制解析时需要加!后缀,而对于Int!则不需要加!后缀,Swift会自动进行隐式解析。
举个栗子:
var s1 : String? = "abcdef"
var s11 = s1!
var s2 : String! = "abcdef"
var s22 = s2
4.在隐式可选类型的变量没有值的情况下,获取该变量的值同样会导致运行时错误,所以也要进行判断。举个栗子:
var name : String!;
name = "abcdef"
if name != nil
{
var tmp = name;
}else
{
print("不能进行解析")
}
5.需要说明的是,隐式可选类型主要用于定义那些被赋值之后不会重新变为nil的变量。如果一个变量在程序运行期间会重新变为nil,那么应该用普通的可选类型来定义变量。
五.类型别名
1. Swift提供了类似C语言中typedef的功能,可以为***已经有的类型***指定一个可读性更强的名字---重命名。
2. Swift使用typealias来定义类型别名:
typealias myInt = Int
typealias myString = String
var age : myInt = 17;
var name : myString = "swift"
3.个人认为:类型别名并无卵用。。。。
网友评论