swift 边学边忘.在工作中使用的oc.真是费劲啊.
这次好好做个笔记,忘了回来翻翻~
学习方法:是看慕课网的视频,看了官方文档,很多写都不清楚,绕来绕去的,还是没明白.可能还是功力不够吧.
(一)为什么要有可选型
swift的设计者认为我们不应该用同一个类型中的某一个特殊值来代表没有这个概念.比如说:我们不应该用Int类型中的0 来代表没有这个概念.而应该用统一的一个符号或者值来代表这个没有.
总结:可以看出可选性 就是说明这个变量 有可能为空.
(二)可选型解包
可选性不能直接使用
解包方法一:强制解包
在后面加一个感叹号(!)
print(errorCode2!+2)
但是这样是有风险的 这个意识一定要有.每次强制解包使用的时候都要注意.
一般是这样写:
if errorCode2 != nil{
print(errorCode2!+3)
}
解包方法二: if let 解包 ,赋值的过程就是一个尝试解包的过程
if let errorCode2 = errorCode2{
print(errorCode2+3)
}
这个命名可以和原来的errorCode2一致.在后面使用的时候,就不用强制解包.
解包方法三:如果多个变量解包,可以一起解包
if let errorCode2 = errorCode2,imoptional = imoptional{
print(errorCode2+3)
print(imoptional)
}
也可以加入条件
if let errorCode2 = errorCode2,imoptional = imoptional where errorCode2 == 200{
print(errorCode2+3)
print(imoptional)
}
(三)Option Chaining 和 Nil-Coalesce
if let errorMessage = errorMessage{
errorMessage.uppercaseString
}
errorMessage?.uppercaseString 这句代码和上面的两行代码意思一致.
我们获取这个变量,在使用的时候,它还是一个可选型
let upStr = errorMessage?.uppercaseString //upStr 是一个隐式的可选型
使用的时候还是不安全 所以我们还需要判断 不过我们可以使用可选链
if let upStr = errorMessage?.uppercaseString{
print(upStr)
}
一个非常常见的一个OC写法,声明一个变量,在函数中进行判断,如果有值,那么赋值成功,如果没有值,那么我们会赋一个默认值.我们这样写其实就是希望这个message 永远有值.所以没有使用?标明可选型.
var message:String
code message
//但是初始化的时候不进行赋值.我们在这里使用的 时候就会很危险.
if let errorMessage = errorMessage{
message = errorMessage
}else{
message = "No Error"
}
这个时候我们可以使用三目运算符
var message = errorMessage == nil ? errorMessage : "No Error"
还有swift提供一种更简单的写法 两个??表示这个变量确实是nil
var message = errorMessage ?? "No Error"
(三)可选型的一个实际应用
var ageInput:String = "16"
var age = Int(ageInput)
if let age = Int(ageInput) where age < 20 {
print("You're a teenager")
}
(四)隐式可选型 当使用的时候可以不对他解包 默认是nil
var message:String! = nil
var errorMessage:String! = nil
errorMessage = ""
"The Message"+errorMessage
一个隐式可选型的例子
<pre>import UIKit
class City {
let cityName:String
var country:Country
init(cityName:String,coutry:Country){
self.cityName = cityName
self.country = coutry
}
}
class Country{
let countryName:String
var capitalCity:City!//隐式可选型 当使用的时候可以不对他解包 默认的情况是一个Nil
init(countryName:String,capitalCity:String){
self.countryName = countryName
self.capitalCity = City(cityName:capitalCity,coutry: self)
}
func showInfo() {
print("This is \(countryName)")
print("The capital is \(capitalCity.cityName)")
}
}
let china = Country(countryName: "China",capitalCity: "Beijing")
china.showInfo()</pre>
小结:
定义变量的第一种方式:
1.var errorMessage:String //表示errorMessage是String类型,不能为空,nil
errorMessage = nil 这种做法都不允许
var message:String?
errorMessage = message 这种做法都不允许
定义变量第二种方式
var errorMessage:String? //表示errorMessage是String可选类型,可以为空
errorMessage = nil
errorMessage = ""
"The Message"+errorMessage! //但是使用的时候必须解包
定义变量第三种方式
var errorMessage:String! //表示errorMessage是String可选类型,可以为空
errorMessage = nil
errorMessage = ""
"The Message"+errorMessage //但是使用的时候不用解包