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通过协议和操作符定义, 让我们的代码更加美妙.

时间: 2024-11-18 22:56:57

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

iOS: 学习笔记, 值与引用类型(译自: https://developer.apple.com/swift/blog/ Aug 15, 2014 Value and Reference Type

值和引用类型 Value and Reference Types 在Swift中,有两种数据类型. 一是"值类型"(value type), 它是每一个实例都保存有各自的数据,通常定义为struct, enum或tuple. 二是"引用类型"(reference types),它是多实例共享一份数据,这种类型通常定义为class. 在本文中,我们将展示值类型和引用类型各自的优点以及如何在二者之间选择. 它们有什么区别? 最基本的区别是 "值类型"

iOS: 学习笔记, 值与引用类型(译自: https://developer.apple.com/swift/blog/ Aug 15, 2014 Value and Reference Types)

值和引用类型 Value and Reference Types 在Swift中,有两种数据类型. 一是"值类型"(value type), 它是每一个实例都保存有各自的数据,通常定义为struct, enum或tuple. 二是"引用类型"(reference types),它是多实例共享一份数据,这种类型通常定义为class. 在本文中,我们将展示值类型和引用类型各自的优点以及如何在二者之间选择. 它们有什么区别? 最基本的区别是 "值类型"

ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整的学习完所需知识,,其他文件夹的内容如其名说描述一样 没张图片都有文字说明,可以需要该功能的时候搜索一下然后打开图片就可以学习到 网盘下载地址:需要的话给留言我再传上去 http://www.cnblogs.com/langtianya原创 ios学习笔记图片+图片解释(c语言 oc语言 ios控件

iOS: 学习笔记, Swift操作符定义

Swift操作符可以自行定义, 只需要加上简单的标志符即可. @infix 中置运算. 如+,-,*,/运算 @prefix 前置运算. 如- @postfix 后置运算. a++, a-- @assignment 赋值运算. +=, -=, --a, ++a // // main.swift // SwiftBasic // // Created by yao_yu on 14-7-27. // Copyright (c) 2014年 yao_yu. All rights reserved.

iOS: 学习笔记, Swift与Objective-C混用简明教程(转载)

Swift与Objective-C混用简明教程 转载自:https://github.com/lifedim/SwiftCasts/tree/master/000_mix_swift_objc 我想很多iOS开发者在知道Swift后,心中最大的问题就是如何将Swift应用到原有项目之中.下面我将简要介绍这2种语言的混用方法,内容参考自官方文档 Using Swift with Cocoa and Objective-C ,推荐大家阅读. 在Swift中使用Objective-C类 在Xcode6

iOS: 学习笔记, Swift与Objective-C混用总结

Swift与Objective-C交互总结 在Swift中使用Objective-C(简单) 在创建OjbC文件时, XCode会提示创建XXX-Bridging-Header.h文件, 创建之 在创建的XXX-Bridging-Header.h上导入需要引入到Swift中的Objective-C类 #import "Need.h" 然后在Swfit中就能使用它了 在Ojbective-C中使用Swift(非常简单) 在相应的OjbC文件中加入 #import "XXX-Sw

iOS: 学习笔记, 用代码驱动自动布局实例(swift)

iOS自动布局是设置iOS界面的利器.本实例展示了如何使用自动布局语言设置水平布局, 垂直布局1. 创建空白iOS项目(swift)2. 添加一个控制器类, 修改YYAppDelegate.swift文件 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFi

iOS: 学习笔记, swift扩展

// // YYExtension.swift // // Created by yao_yu on 14-7-18. // Copyright (c) 2014年 yao_yu. All rights reserved. // import Foundation extension String{ func strip() -> String{ return stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineC

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全