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中构建布尔类型