在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
可选类型详解 直接上代码解释 // 类中所有的属性在对象初始化时,必须有初始化值 class Person : NSObject { var name : String? var view : UIView? var age : String? } // 1.定义可选类型 // 1>普通定义可选类型的方式 var name : Optional<String> // 2>语法糖 //这样写默认为空 var name : String? // 2.给可选类型赋值 name = "why" // 3.从可选类型中取值 print(name) // Optional("why") // 从可选类型中取值:可选类型!-->强制解包 //print(name!) // 4.注意:如果可选类型中没有值,那么强制解包程序会崩溃 // 强制解包是非常危险的操作:建议在解包前先判断可选类型中是否有值 if name != nil { print(name!) print(name!) print(name!) }
"?" 这个简单意思,你的变量可能为nil,或者你可能将nil赋值给它,需要给变量定义的时候加上"?",否则一旦你将nil赋值给没有加"?"的变量,编译就会报错 打印name 输出 Optional("why")
发现有个Optional 就说明这个变量被包着,那么怎么才能不让它包裹着呢? 很简单, 给变量加一个"!" print(name!) //输出 why
我们还有一种解包的方式 let nickName: String? = nil let fullName: String = "XUJIE" let name = nickName ?? fullName //如果第一个解包值发现为nil,则使用第二值 print(name) ?? 的使用还有一个注意点 先看下面的例子 let a:Int! = 3 let b = 4 // 如果a不为nil则对a进行解包,赋值将b的值付给c let c = a != nil ? a! : b //??的用法相当于上面 let c = a ?? b // 如果a为nil则使用b的值替换a的值,如果a不为nil,则对a解包然后将值付给b 再看一个例子 let a:Int??? = 3 let b = 4 let c = a ?? b // 分析对a进行一次解包,得到的值不为nil,所以把解包后的值付给c print(a) print(c)
运行结果: Optional(Optional(Optional(3))) Optional(Optional(3))
再看一个例子(问题来了哦) let a:Int??? = nil let b = 4 let c = a ?? b print(a) print(c)
有些人已经猜到答案 nil 4 但我告诉你答案不是这样的,先来分析一下 首先a,有三个包Optional(Optional(Optional(nil))),当我们解掉第一次包后,发现值为nil,此时,我们需要将b的值替换给a,Optional(Optional(4))
所以我们的最终显示结果为: nil Optional(Optional(4))
可选绑定(判断可选类型中是否有值) let urlString = "http://www.520it.com" let url : URL? = URL(string: urlString) // 1.普通写法 if url != nil { let request = URLRequest(url: url! ) } // 可选绑定 if let url = url { let request = URLRequest(url: url) } // 可选绑定的简介写法 if let url = URL(string: urlString) { let request = NSURLRequest(url: url) }
|
请发表评论