在Swift中構建布爾類型

Swift中的Bool類型是許多原始函數的基礎。因此基於它能夠展現一個有趣的如何構建基本類型的示例。這篇文章的主旨是在Swift中建立一個相似Bool類型的新類型MyBool。咱們但願經過這個簡單的示例,能讓你更清晰的瞭解Swift語言的工做原理。swift

讓咱們從最基本的定義開始。咱們用枚舉來定義MyBool類型的模型,它有兩個不一樣的case函數

enum MyBool {
    case myTrue, myFalse
}

爲了使你們不會產生混淆,這篇文章中咱們將MyBool的兩個case命名爲myTruemyFalse。咱們但願MyBool的構造函數MyBool()將其自身賦值爲false,因此咱們提供了以下init方法:測試

extension MyBool {
    init() { self = .myFalse }
}

Swift中的枚舉會隱式的在它們自身內申明其枚舉檢索器的範圍,容許咱們使用MyBool.myFalse這種語法調用其成員,若是根據上下文能夠推斷出類型的話,咱們甚至能夠使用.myFalse調用其成員。可是在真正使用中,咱們仍是但願使用原始的truefalse關鍵字。想要作到這一點,咱們的新類型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提供的值類型,使咱們能夠徹底掌控豐富多變的各類操做,好比enumstruct

至此,簡單的MyBool類型已經具有了基本的運算符操做。但願這篇文章能給你一些思路,使你可以在本身的代碼中構建更高級更復雜的類型。

本文首發地址:在Swift中構建布爾類型

相關文章
相關標籤/搜索