本頁包含內(nèi)容:
小伙伴們,Swift 中的 Bool 類型有著非常重要的語法功能,并支撐起了整個 Swift 體系中的邏輯判斷體系,經(jīng)過老碼的研究和學(xué)習(xí), Bool 類型本身其實是對基礎(chǔ) Boolean 類型封裝,小伙伴們可能咬著手指頭問老碼,怎么一會 Bool 類型,一會 Boolean 類型,其區(qū)別在于,前者是基于枚舉的組合類型,而后者則是基本類型,只有兩種 true 和 false。
接下老碼根據(jù) Bool 的思想來創(chuàng)建一個 OCBool 類型,來讓小伙伴們了解一下 Swift 中到底是怎么玩兒的。 來我們先看一下 OCBool 的定義。
enum OCBool{
case ocTrue
case ocFalse
}
行,我們給了一個漂亮的定義,不過按照傳統(tǒng)語言的經(jīng)驗,Bool 值默認(rèn)情況下是假, 所以我們的 OCBool 也應(yīng)該如此,我們使用類型擴(kuò)展技術(shù)增加這個默認(rèn)特性:
extension OCBool{
init(){
self =.ocFalse
}
}
var result:OCBool = OCBool()
var result1:OCBool = .ocTrue
正如上述代碼所述,我們只能通過類型或者枚舉項目賦值,這是組合類型的用法,但是編碼的日子里,我們總是希望和 true,false 直接打交道,也就是說,我們希望這么做, 代碼示例如下:
var isSuccess:OCBool = true
如果小伙伴們直接這么用,則會出現(xiàn)如下錯誤:
/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:30:24: Type 'OCBool' does not conform to protocol 'BooleanLiteralConvertible'
編譯器咆哮的原因是,我們的類型沒有遵從“布爾字面量轉(zhuǎn)換協(xié)議”,接下來修正這個問題,
import Foundation
println("Hello, World!")
enum OCBool{
case ocTrue
case ocFalse
}
extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
return value ? ocTrue : ocFalse
}
}
var isSuccess:OCBool = true
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}
小伙伴們不安分, 肯定想著我怎么用它實現(xiàn)邏輯判斷,所以如果你這么寫,
var isSuccess:OCBool = true
if isSuccess {
println("老碼請你吃火鍋!")
}
你永遠(yuǎn)吃不到老碼的火鍋,因為這里編譯器會咆哮:
/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:27:4: Type 'OCBool' does not conform to protocol 'LogicValue'
OCBool 現(xiàn)在只能用 bool 類型初始化,而不能直接返回 bool 型,小火把們還記得在《老碼說編程之白話 Swift 江湖》中,老碼多次提到,媽媽再也不擔(dān)心我們 if a = 1{}的寫法了, 因為等號不支持值返回了, 所以在 if 判斷是后面的條件必須有返回值,OCBool 沒有,所以編譯器哭了。我們解決這個問題。
import Foundation
println("Hello, World!")
enum OCBool{
case ocTrue
case ocFalse
}
extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
return value ? ocTrue : ocFalse
}
}
extension OCBool: LogicValue{
func getLogicValue() ->Bool {
var boolValue: Bool{
switch self{
case .ocTrue:
return true
case .ocFalse:
return false
}
}
return boolValue
}
}
var isSuccess:OCBool = true
if isSuccess {
println("老碼請你吃火鍋!")
}
Hello, World!
老碼請你吃火鍋!
Program ended with exit code: 0
小伙伴們,江湖風(fēng)險,門派眾多,老碼有自己的 OCBool 類型,可能嵩山少林有自己的 SSBool 類型,甚至連郭美美都可能有自己的 MMBool 類型,所以 OCBool 必須能夠識別這些類型,這些各門各派的類型,只要支持 LogicValue 協(xié)議,就應(yīng)該可以被識別,看老碼怎么做,
extension OCBool{
init( _ v: LogicValue )
{
if v.getLogicValue(){
self = .ocTrue
}
else{
self = .ocFalse
}
}
}
var mmResult: Bool = true
var ocResult:OCBool = OCBool(mmResult)
if ocResult {
println("老碼沒錢,郭美美請你吃火鍋!")
}
Hello, World!
老碼沒錢,郭美美請你吃火鍋!
Program ended with exit code: 0
漂亮!我們的 OCBool 類型現(xiàn)在支持了所有的邏輯變量初始化。
小伙伴們,bool 類型的價值就是在于各種判斷,諸如==,!=, &,|,^,!,以及各種組合邏輯運算,我們 OCBool 也要具備這些功能,否則就會基因缺陷,且看老碼如何實現(xiàn):
extension OCBool: Equatable{
}
//支持等值判斷運算符
func ==( left: OCBool, right: OCBool )->Bool{
switch (left, right){
case (.ocTrue, .ocTrue):
return true
default:
return false
}
}
//支持位與運算符
func &( left:OCBool, right: OCBool)->OCBool{
if left{
return right
}
else{
return false
}
}
//支持位或運算符
func |( left:OCBool, right: OCBool)->OCBool{
if left{
return true
}
else{
return right
}
}
//支持位異或運算符
func ^( left:OCBool, right: OCBool)->OCBool{
return OCBool( left != right )
}
//支持求反運算符
@prefix func !( a:OCBool )-> OCBool{
return a ^ true
}
//支持組合求與運算符
func &= (inout left:OCBool, right:OCBool ){
left = left & right
}
var isHasMoney:OCBool = true
var isHasWife:OCBool = true
var isHasHealty:OCBool = true
var isHasLover:OCBool = true
isHasMoney != isHasHealty
isHasHealty == isHasMoney
isHasWife ^ isHasLover
isHasWife = !isHasLover
if (isHasMoney | isHasHealty) & isHasHealty{
println("人生贏家,就像老碼一樣!")
}else
{
println("人生最苦的事事,人死了錢沒花了,人生最苦的事是,人活著,錢沒了!")
}
好了,到這里就到這里了,窗外的雷聲叫醒了老碼,現(xiàn)在應(yīng)該去吃飯了,以上老碼給大家展示了如果制造一個自己的類型,記得老碼的示例是在 Xcode6 Beta4下測試的,至于 Beta5的改變還沒有涉及,小伙伴們要好生練習(xí),以后各種自定類型都是基于這個思想。還有這個章節(jié)不是老碼的原創(chuàng),老碼認(rèn)真的閱讀了蘋果的官方博客,且自己的練習(xí)總結(jié),如果小伙伴們費了吃奶的勁還是看不懂,請找度娘谷歌,還是看不懂請到老碼官方微博:http://weibo.com/u/5241713117咆哮。
本文由翻譯自 Apple Swift Blog :https://developer.apple.com/swift/blog/?id=8