首页 > 代码库 > swift 进阶笔记 (一) —— 可选型
swift 进阶笔记 (一) —— 可选型
swift定义可选型的时候,要用“?”,但是在swift的标准库中,可选型的定义是Optional<T>,”?”只是个简写形式。
var myNum: Int?
var myNum: Optional<Int>
两句等价
可以看出可选型是个泛型,而Optional又是个枚举,Optional可以是 None,也可以是Some(T):
protocol Reflectable {
/// Get the mirror that reflects this object.
func getMirror() -> Mirror
}
/// Get the mirror that reflects this object.
func getMirror() -> Mirror
}
protocol LogicValue {
func getLogicValue() -> Bool
}
func getLogicValue() -> Bool
}
enum Optional<T> : LogicValue, Reflectable {
case None
case Some(T)
init()
init(_ some: T)
/// Allow use in a Boolean context.
func getLogicValue() -> Bool
/// Haskell‘s fmap, which was mis-named
func map<U>(f: (T) -> U) -> U?
func getMirror() -> Mirror
}
case None
case Some(T)
init()
init(_ some: T)
/// Allow use in a Boolean context.
func getLogicValue() -> Bool
/// Haskell‘s fmap, which was mis-named
func map<U>(f: (T) -> U) -> U?
func getMirror() -> Mirror
}
从定义中可以看出,可选型是符合LogicValue协议的,所以,可以被用在if判断中。那么这里就有一个很好玩的事情了:在swift中,Int并不可以写在 if中,比如:
var a:Int = 3
if a { //这里会报错
println(“hehe")
}
但是我们学过扩展,我们可以自行让Int写在if中:
extension Int:LogicValue { //我让Int遵循了LogicValue协议
func getLogicValue() -> Bool { //实现LogicValue协议的要求
if self != 0 { //非0的话,返回true,否则返回false
return true
} else {
return false
}
}
}
var a:Int = 3
if a { //这里不会报错了!!!
println("hehe")
}
func getLogicValue() -> Bool { //实现LogicValue协议的要求
if self != 0 { //非0的话,返回true,否则返回false
return true
} else {
return false
}
}
}
var a:Int = 3
if a { //这里不会报错了!!!
println("hehe")
}
是不是忽然觉得很灵活,很好玩。。。只要附合语言解析的逻辑,就可以创造出很多玩法。。。。
但是。。。这只是玩玩,千万别用在项目里,如果真要用,这也仅仅是语法糖。。。
隐式解析可选型
之前提到可选型 “?”是Optional<T>的简写形式。
”!”则是ImplicitylyUnwrappedOptional<T>的简写形式。这叫做隐式解析可选型
如同可选型一样,隐式解析可选型也可以写成两种形式:
var num:Int!
var num:ImplicitlyUnwrappedOptional<Int>
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。