每天学一点Swift----可选类型

2017-05-11  本文已影响23人  冯可乐同学

一.可选和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.个人认为:类型别名并无卵用。。。。

上一篇 下一篇

猜你喜欢

热点阅读