博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS: 学习笔记, 透过Boolean看Swift(译自: https://developer.apple.com/swift/blog/ Aug 5, 2014 Boolean)...
阅读量:7145 次
发布时间:2019-06-29

本文共 2539 字,大约阅读时间需要 8 分钟。

透过Boolean看Swift

一个简单的Bool类型内部就包括了很多Swift主要功能, 怎样构建一个简单类型是有趣的演示. 本文将创建一个与Bool类型在设计与实现上很相似的新MyBool类型.我们希望通过设计和实现一个简单的Swift类型能让你更好的理解Swift语言是怎样工作的.

enum MyBool {    case myTrue, myFalse}

让我们从主要的定义開始. MyBool类型有两种不同状态, 用enum来实现

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

为了不误解,我们命名状态为 myTrue 和 myFalse. 我们希望 MyBool() 默觉得false值, 因此我们实现一个 init 方法:

Swift enum 声明隐含了枚举值的有效范围, 它同意我们使用 MyBool.myFalse 甚至是在环境类型同意时能够使用 .myFalse. 然而, 我们须要我们的类型能够用 true 和 false 常量赋值. 要实现它, 我们让 MyBool 实现 BooleanLiteralConvertible 协议:
extension MyBool : BooleanLiteralConvertible {

extension MyBool : BooleanLiteralConvertible {    static func convertFromBooleanLiteral(value: Bool) -> MyBool {        return value ? myTrue : myFalse    }}//就样,我们就能够把'true'和'false'赋给MyBoolvar a : MyBool = true

这一步完毕, 我们就有了基础类型, 可是我们做的事情还不够. Booleans 须要用于 if 条件推断. Swift用 BooleanType 协议来实现它, 它使随意类型都能够用于逻辑条件:

extension MyBool : BooleanType {    var boolValue: Bool {        switch self {        case .myTrue: return true        case .myFalse: return false        }    }}// 如今MyBool能够用于 'if' 各 'while' 条件推断.if a {}

我们相同希望所以符合 BooleanType 协议的变量能够转换到MyBool, 所以我们加上

extension MyBool {    // MyBool能够通过BooleanType构造    init(_ v : BooleanType) {        if v.boolValue {            self = .myTrue        } else {            self = .myFalse        }    }}// 如今能够将 boolean-like 类型.var basicBool : Bool = truea = MyBool(basicBool)

注意, 在初始化參数中使用 _ 来禁用參数keyword, 它同意使用 MyBool(x) 语法来替代默认的 MyBool(v: x).

如今我们有了主要的功能, 以下我们从 == 開始定义一些操作符. 编译器并没有使简单的枚举自己主动 Equatable, 因此还须要额外的代码. 这里, 你能够实现 Equatable 协议和 == 操作符来实现随意类型进行相等比較. 假设 MyBool还没有 Equatable, 能够实现例如以下:

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 {}

这里我们在switch语句中用一些简单的模式匹配来处理. 既然 MyBool 已经 Equatable, 我们就不用再实现 != 操作符. 以下我们添�二进制操作:

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 修饰符. 对值类型(如enum和struct), Swift为你提供了完整的改动操作控制.

通过这些, 简单 MyBool 类型有了全部的基本操作和操作符. 希望本文的提示能够为定义高级类型提供參考.

来自: 

 

后记:

麻雀虽小, 五脏俱全. Swift通过协议和操作符定义, 让我们的代码更加美妙.

转载地址:http://lsgrl.baihongyu.com/

你可能感兴趣的文章
python基础3(元祖、字典、深浅copy、集合、文件处理)
查看>>
正确编写Designated Initializer的几个原则
查看>>
iOS播放动态GIF图片
查看>>
获取版本号
查看>>
使用jdk自带的visualVM监控远程监控was
查看>>
集合视图UICollectionView 介绍及其示例程序
查看>>
JsLint 的安装和使用
查看>>
合并傻子//区间dp
查看>>
让IE和Chrome都以隐身模式启动
查看>>
npm install --save 与 npm install --save-dev 的区别
查看>>
hibernate和jdbc的区别 优缺点
查看>>
斯坦福大学机器学习第一课“引言(Introduction)”
查看>>
MAC OS环境下搭建基于Python语言的Selenium2自动化测试环境
查看>>
Web端五子棋的实现之所遇到的问题
查看>>
gedit增加对指定文件格式(如qml)的识别和启用合适的语法高亮
查看>>
sql字符串包含单引号
查看>>
一句话评论设计模式六大原则【转】
查看>>
如何使用临时文件
查看>>
【原创】关于ARM的22个常用概念介绍
查看>>
【SICP归纳】3 层次性数据和符号数据
查看>>