Swift中的Bool
類型是許多原始函數的基礎。因此基於它能夠展現一個有趣的如何構建基本類型的示例。這篇文章的主旨是在Swift中建立一個相似Bool
類型的新類型MyBool
。咱們但願經過這個簡單的示例,能讓你更清晰的瞭解Swift語言的工做原理。swift
讓咱們從最基本的定義開始。咱們用枚舉來定義MyBool
類型的模型,它有兩個不一樣的case
:函數
enum MyBool { case myTrue, myFalse }
爲了使你們不會產生混淆,這篇文章中咱們將MyBool
的兩個case
命名爲myTrue
和myFalse
。咱們但願MyBool
的構造函數MyBool()
將其自身賦值爲false
,因此咱們提供了以下init
方法:測試
extension MyBool { init() { self = .myFalse } }
Swift中的枚舉會隱式的在它們自身內申明其枚舉檢索器的範圍,容許咱們使用MyBool.myFalse
這種語法調用其成員,若是根據上下文能夠推斷出類型的話,咱們甚至能夠使用.myFalse
調用其成員。可是在真正使用中,咱們仍是但願使用原始的true
和false
關鍵字。想要作到這一點,咱們的新類型MyBool
須要遵循BooleanLiteralConvertible
協議,像這樣:code
extension MyBool : BooleanLiteralConvertible { static func convertFromBooleanLiteral(value: Bool) -> MyBool { return value ? myTrue : myFalse } } // 咱們如今就能夠給MyBool類型的變量賦值爲true或false. var a : MyBool = true
經過以上設置,咱們有了本身的基本類型,可是目前咱們用它還作不了什麼。布爾值須要經過if
條件語句進行測試。在Swift中,咱們經過BooleanType
協議來作到這一點,該協議容許任意類型用於進行邏輯判斷:對象
extension MyBool : BooleanType { func getBooleanType() -> Bool { switch self { case .myTrue: return true case .myFalse: return false } } } // 如今咱們就能夠將MyBool類型的變量a用於'if'和'while'語句中進行測試. if a {}
咱們更但願全部遵循了BooleanType
協議的類型都要強制轉換爲MyBool
類型,因此咱們能夠這樣寫:get
extension MyBool { // MyBool類型構造函數的參數設定爲BooleanType類型. init(_ v : BooleanType) { if v.getBooleanType() { self = .myTrue } else { self = .myFalse } } } // 如今咱們就能夠這樣進行轉換了. var basicBool : Bool = true a = MyBool(basicBool)
注意構造函數裏的_
,它能夠使咱們在使用構造函數時省略參數命名。能夠使用MyBool(x)
這種語法,而不用使用MyBool(v: x)
這種囉嗦的語法。編譯器
如今咱們有了基本的功能,如今讓咱們來定義它的操做符,先來看看如何定義==
操做符。沒有關聯數據的簡單的枚舉(像MyBool
同樣)是由編譯器自動認爲遵循Equatable
協議進行編譯的,因此沒有必需要實現額外的代碼。儘管如此,你也可讓任意類型遵循Equatable
協議,並實現==
操做符。好比咱們的MyBool
類型:it
extension MyBool : Equatable { } func ==(lhs: MyBool, rhs: MyBool) -> Bool { switch (lhs, rhs) { case (.myTrue,.myTrue), (.myFalse,.myFalse): return true default: return false } } // 如今咱們就能夠使用==和!=進行比較了. if a == a {} if a != a {}
這裏咱們在swich
語句中使用簡單的匹配模式來處理。因爲MyBool
如今遵循了Equatable
協議,因此他已經自動實現了!=
操做符。再讓咱們加一些二進制運算符:io
func &(lhs: MyBool, rhs: MyBool) -> MyBool { if lhs { return rhs } return false } func |(lhs: MyBool, rhs: MyBool) -> MyBool { if lhs { return true } return rhs } func ^(lhs: MyBool, rhs: MyBool) -> MyBool { return MyBool(lhs != rhs) }
有了基本的運算符後,咱們就能夠實現各類有用的一元和複合賦值運算符,好比:編譯
prefix func !(a: MyBool) -> MyBool { return a ^ true } // 複合賦值(按位) func &=(inout lhs: MyBool, rhs: MyBool) { lhs = lhs & rhs }
&=
運算符將左邊的運算對象做爲inout
對象,由於要對它進行讀寫操做,而且其效果對於操做者是可見的。Swift提供的值類型,使咱們能夠徹底掌控豐富多變的各類操做,好比enum
和struct
。
至此,簡單的MyBool
類型已經具有了基本的運算符操做。但願這篇文章能給你一些思路,使你可以在本身的代碼中構建更高級更復雜的類型。
本文首發地址:在Swift中構建布爾類型