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 }
protocol LogicValue { 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 }
从定义中能够看出,可选型是符合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" ) } 是不是忽然认为非常灵活,非常好玩。
。。
仅仅要附合语言解析的逻辑,就能够创造出非常多玩法。
。
。。
可是。。。这不过玩玩,千万别用在项目里,假设真要用。这也不过语法糖。
。。
隐式解析可选型
之前提到可选型 “?
”是Optional<T>的简写形式。
”!”则是ImplicitylyUnwrappedOptional<T>的简写形式。这叫做隐式解析可选型
如同可选型一样,隐式解析可选型也能够写成两种形式:
var num:Int!
var num:ImplicitlyUnwrappedOptional<Int>