可选类型是Swift学习中的一个难点 , OC中也没有解包的概念 , 并且其实咱们在运用OC编程中 , 很多的操作都是不安全的 ,然而在Swift中已经感受到了强类型语言的严谨性和安全性
//为什么要有可选类型 ? 因为在开发中,很多时候我们初始化一个变量,而并不会立即对其赋值 , 然而基本数据类型我们可以初始化 0 ,如果是其他类型比如字符串 , 我们没有办法对其直接赋值为nil
// let name = nil 报错
// let name:String = nil 报错
let name:String
name = "xiaoming" //此种写法虽然不报错 ,但是在定义类里,必须要有初始值 如下类 . 此时我们就用到了可选类型
//定义一个类,这里只是证明类里的属性必须做初始化
class Student: NSObject {
// var name:String 报错
var name:String? = nil //可选类型初尝试
}
//1.定义可选类型
//可选类型写法1 :(不常用)
var name1:Optional<String> = nil
//可选类型写法2 :(常用,语法糖)
var name2:String? = nil
//2.给可选类型赋值
name2 = "my"
//3.取出可选类型值
print(name2) //注意:此处取出的类型是Optional ,并非我们想要的String类型 ,所以此处可以进行强制解包 ,将name2从Option包中解除
print(name2!) //强制解包 ,打印内容类型为String
//注意:强制解包操作非常危险 ,因为如果可选类型中的值为nil ,系统会崩溃
//所以在解包前,必须进行判断 ,只有当包里的内容不为nil时才进行强制解包
if name2 != nil {
print(name2)
}
//4.可选绑定 (应用场景:如果我要反复的使用一个Optional包里的内容,如果我每次使用都要进行解包,是十分忧桑的一件事,所以苹果推出了一个可选绑定的语法如下)
//实质上 let tempName = name2 这句话做了2个操作
//1.判断name2 是否为nil ,如果为nil ,直接不执行{}中的内容
//2.如果name2 不为nil ,进行解包并赋值给tempName, 执行{}中的内容
//写法一 (不常用)
if let tempName = name2 {
print(tempName)
}
//写法二 (常用)
if let name2 = name2 {
print(name2)
}
//5. 可选类型的使用场景
//通过一个字符串创建一个URL
let url = NSURL(string: "http://www.jyall.com") //此方法返回值为NSURL? ,如果使用url:NSURL 直接报错,类型不一致
let url1:NSURL? = NSURL(string: "http://www.jyall.com")
//根据URL创建NSRequest
if let url1 = url1 {
let request = NSURLRequest(URL: url1) //强制解包
}