码迷,mamicode.com
首页 > 其他好文 > 详细

swift 进阶笔记 (一) —— 可选型

时间:2014-06-22 22:20:27      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:style   ext   color   get   name   rgb   

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> : LogicValueReflectable {
    
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> 

swift 进阶笔记 (一) —— 可选型,布布扣,bubuko.com

swift 进阶笔记 (一) —— 可选型

标签:style   ext   color   get   name   rgb   

原文地址:http://blog.csdn.net/supergerm/article/details/32732039

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!