iOS: 学习笔记, 透过Boolean看Swift(译自: https://developer.apple.com/swift/blog/ Aug 5, 2014 Boolean)

iOS: 学习笔记, 透过Boolean看Swift(译自: https://developer.apple.com/swift/blog/ Aug 5, 2014 Boolean)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

透过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'赋给MyBool
var 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 = true
a = 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 类型有了全部的基本操作和操作符. 希望本文的提示能够为定义高级类型提供參考.

来自:苹果官方博客2014-8-5 Boolean 

 

后记:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118555.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月4日 下午2:00
下一篇 2021年12月4日 下午3:00


相关推荐

  • HDU 5952 Counting Cliques -暴力

    HDU 5952 Counting Cliques -暴力

    2022年3月2日
    38
  • qtcpsocket用法_qtcpsocket发送16进制数据

    qtcpsocket用法_qtcpsocket发送16进制数据在QTcpSocket中的tcp通信,发送数据,接收数据都是QTcpSocket套接字的功能,包括server端,QTcpServer的功能仅仅是作为一个服务器的存在;客户端:classClient:publicQWidget{Q_OBJECTpublic:explicitClient(QWidget*parent=0);~Cl…

    2025年10月17日
    5
  • Android程序员的年终总结「建议收藏」

    Android程序员的年终总结「建议收藏」欢迎您能进来,如果你也和我一样,对接下来的工作行情充满了太多的不确定性,那不妨停下您冲忙前进的脚步,和我一起重新刷新一下你自己的看法和规划吧!我的提问2019年Android真的还可以养活你自己? 2019年我的工作重心在哪一块? 2019年是继续留在原地做技术积累还是考虑跳槽? 对过去2018年的总结是否满意?我能做什么管理方向(天赋欠缺,暂不做讨论) 技术方向从An…

    2022年6月14日
    39
  • webstorm2021.10激活码mac[最新免费获取]

    (webstorm2021.10激活码mac)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    240
  • 时序数据表示学习

    时序数据表示学习时序数据表示学习研究背景及工作概述时序数据在我们的日常生活中广泛存在 随着采集设备不断升级 各类传感器的大规模部署 每天都在以数以亿计的速度产生时序数据 主要包括遥感领域的 GPS 轨迹数据 包括卫星通讯 态势监控 雷达遥感 以及其他领域的设备日志 操作记录 用户活动等等 这类数据具有数据体量庞大 关联信息异构 分析任务多样等特点对于时序数据的处理框架主要聚焦在存储和索引上 而传统的分析算法难以适应大规模 异构 复杂的分析任务在 2012 年斯坦福的教授第一次将深度学习框架引入了时序数据建模上 从而开

    2026年3月17日
    1
  • python中文件的写入_python列表写入txt文件

    python中文件的写入_python列表写入txt文件1.自己写入txt直接上核心代码:withopen(“douban.txt”,”w”)asf:f.write(“这是个测试!”)12这句话自带文件关闭功能,所以和那些先open再write再close的方式来说,更加pythontic!结果就是这样:2.将文件输入(print)的内容写入txt我并不喜欢手写字符,更多时候用到的就是将程序跑出来的print写到txt中保存,比如

    2022年10月2日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号