Swift 基础语法补充:
一.可选类型:
可选类型是swift的一大特色,在定义变量时,如果指定这个变量是可选的话,就是说这个变量可以有一个指定类型的值或者为nil。
? 和 ! 的区别
“?”表示可选类型(Optionals),“!”表示隐式可选类型,其实还是可选类型。
可选类型:将已存在的某种类型(结构体、枚举、类)定义为可选类型,表示该“新”类型的值可以为空nil
var nickName : String?
使用self.label!是明确声明此时self.label里一定有值,无论什么情况都调用后面的.text赋值方法。
而使用self.view?是声明此时并不确定self.view里是否有值,所以只在view有值时调用后面.addSubview方法。
这样做的目的一是让代码更明确, 二是给编译器提供更多线索,在编译时发现更多潜在错误。
1.定义一个optional 的常量:
let x:Optional = 10
print(x)
点击进去查看,可以发现Option其实是一个枚举类型。这个枚举有两个值,一个是none,表示没有值,而另一个是some,表示某一类值。
在输出的时候,可以看见控制台上的内容Optional(10),它的作用就是提示这是一个可选值。
而在实际开发中,一般不用上述方式创建可选值,而是指定一个类型,再在其后添一个问号。
let x:Optional = 10 //第一种写法 let x:Int? = 20 //第二种写法 print(x)
上述代码问号的意思就是定义一个可选的Int类型,可能没有值,也可能有一个整数。
2.解包:
试试将上面案例x和y相加,这个时候还能输出结果么?
此时可以看到编译器已经报错。在前面的教程中提到过,不同类型的值是不能直接运算的。而可选项若它的值为nil则不能参加计算。
因此引入解包的概念,“!”代表强制解包。它的意思是从可选值中强行获取对应的非空值。
输出结果:
3.解包常见错误:
//错误示范1 let y : Int? print(y)
使用let定义的是常量,在初始化时必须要给出值。
//错误示范2: let y : Int? = nil print(y)
强制解包是危险操作,如果可选值为nil,强制解包系统会奔溃。
4.let 和 var的可选默认值:
//默认值测试 let x: Int? print(x) var y :Int? print(y)
用let做测试时会直接报错,说明let的可选值是没有默认值的,而用var做测试时,报错信息就变成了警告,运行的结果为nil。可以由此推测出var的可选项默认值为nil。
swift中有规定,对象中的任何属性在创建对象时,都必须有明确的初始化值。
5.可选绑定:
用if let/var表示。它将变量赋值给一个临时变量,在这个操作中会做两步操作:首先判断变量是否有值,如果没有值,则直接不执行大括号里面的内容;如果有值,系统会自动将变量进行解包,并且将解包后的结果,赋值给临时变量。
//例如
通过一个字符串创建NSURL对象
let url: URL? = URL(string: "https://www.baidu.com")
接着创建NSURLRequest对象.
强制解包非常危险,当url有中文的时候可能会变成nil。所以要判断url是否为空再对其进行解包。
if let url = url { let request = URLRequest(url: url) }