和OC相比
可选类型是一个从OC走向Swift的第一个吸引目光的地方,OC是弱类型语言,所以没有可选类型的概念。
可选类型的解绑
首先看声明可选类型:
var optionalStr:String?
Swift中任何类型都可以紧跟一个?变为可选类型
声明后我们赋值打印试试:
optionalStr = "Hello,Swift"
print(optionalStr)
编译器报警告,然后打出的结果是"Optional("Hello,Swift")"而不是我们预期的"Hello,Swift"。
下面有列举几种解除警告的方法:
1.空合运算
print(optionalStr ?? "默认值")
使用空合运算符??为可选类型指定一个默认值,保证它不为空,就不会有警告了。
2.强制解析
print(optionalStr!)
强行告诉编译器,它有值不为空。
- 转换类型
print(optionalStr as Any)
as是表示转换成它对应的类型,转换成一个可以为空的类型Any,自然不会警告了。
4.自动解析
声明的时候直接用!
var optionalStr:String!
optionalStr依然是可选类型,只是当我们使用它的时候,它自动解析为String类型了。
5.可选绑定
if let tempStr = optionalStr {
print(tempStr)
}else{
print("为nil")
}
if let 指的是如果optionalStr有值就给tempStr,为nil就else;
可选类型的应用
知道这么多解绑方法之后,相信你已经迫不及待想用用看了。接下来列举场景的几个应用场景:
1.返回值类型
func returnoptionalValue(value: Bool) -> String? { // 返回类型为可选String类型
if value {
return "返回类型是可选类型值"
} else {
return nil
}
}
func returnoptionalFunc(value: Bool) -> (() -> (Void))? { // 返回类型为可选类型的闭包
if value {
return { () in
print("返回类型是可选类型闭包")
}
} else {
return nil
}
}
不多解释,试试怎么解绑。
2.作为属性
//类
class OptionalClass {
var aValue: Int = 0
var optionaValue: String? //默认值为nil
}
//结构体
struct OptionalStruct {
var aValue: Int
var optionalValue: String? //默认值为nil
}
这样做的话构造方法中可以不对optionalValue属性初始化
3.可失败构造器
class OptionalStructInit {
let aValue: String
init?(aValue: String) {
if aValue.isEmpty { return nil }
self.aValue = aValue
}
}
class OptionalStructInit实例化后可能为nil(作死?)
4.try
var optionalStr = try? aFunction()
try?会将Error转换为可选值,当调用aFunction时,如果aFunction抛出错误,程序不会发崩溃,而返回一个nil,如果没有抛出错误则返回可选值。
使用try!可以强行崩溃(作死?)
以上就是Swift可选类型的学习记录,欢错指。
网友评论