zoukankan      html  css  js  c++  java
  • 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)

    注意, 在初始化参数中使用 _ 来禁用参数关键字, 它允许使用 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通过协议和操作符定义, 让我们的代码更加美妙.

  • 相关阅读:
    南桥-- 算法训练 2的次幂表示
    Ajax系列之中的一个:ajax旧貌换新颜
    ASP.NET综合管理ERP系统100%源代码+所有开发文档
    创业建议干货分享
    读取properties属性文件——国际化
    測试赛C
    Android 自己定义ViewGroup手把手教你实现ArcMenu
    【VBA研究】利用DateAdd函数取上月或上年同期的日期
    【Java集合源代码剖析】TreeMap源代码剖析
    openstack neutron L3 HA
  • 原文地址:https://www.cnblogs.com/yaoyu126/p/3901302.html
Copyright © 2011-2022 走看看