Swift类型创建之自定义一个类型详解

论坛 期权论坛 脚本     
niminba   2021-5-23 03:43   686   0

小伙伴们,Swift中的Bool类型有着非常重要的语法功能,并支撑起了整个Swift体系中的逻辑判断体系,经过老码的研究和学习, Bool类型本身其实是对基础Boolean类型封装,小伙伴们可能咬着手指头问老码,怎么一会Bool类型,一会Boolean类型,其区别在于,前者是基于枚举的组合类型,而后者则是基本类型,只有两种true和false。

####自定义原型

接下老码根据Bool的思想来创建一个OCBool类型,来让小伙伴们了解一下Swift中到底是怎么玩儿的。

来我们先看一下OCBool的定义。

#####代码示例如下:

复制代码 代码如下:

enum OCBool{
case ocTrue
case ocFalse
}


#####注意:

代码中第2行和第3行,可以合并到一行写,如苹果官方Blog所写的一样
代码中命名需要注意:OCBool是类型名,所以首字母必须大写,而case中的ocTrue和ocFalse是小类型则需要首字母小写。

####实现默认值

行,我们给了一个漂亮的定义,不过按照传统语言的经验,Bool值默认情况下是假, 所以我们的OCBool也应该如此,我们使用类型扩展技术增加这个默认特性:

复制代码 代码如下:

extension OCBool{
     init(){
             self =.ocFalse
     }
}

#####注意:

●代码中第1行:extension关键字,非常强大,小伙伴们可以通过此创造出许多好玩的东西,建议各位去Github上看一个名为“Swiftz”的项目,它将扩展用到了极致。

●代码中第3行:self = .ocFalse语法,刚入门的小伙伴们很迷糊,为什么会有奇怪的点语法,因为大牛Chris在Swift中增加了类型智能推断功能,在苹果Blog中,提到了“Context”概念,就是这个意思,因为这行语句是在枚举OCBool中的,其上下文就是OCBool的定义体,编译器当然知道.ocFalse就是OCBool.ocFalse了,所以这里直接点语法,非常整齐。

现在我们可以使用如下方法使用这个Bool类型。

#####代码示例如下:

复制代码 代码如下:

var result:OCBool = OCBool()
var result1:OCBool = .ocTrue

####支持基本布尔型初始化

正如上述代码所述,我们只能通过类型或者枚举项目赋值,这是组合类型的用法,但是编码的日子里,我们总是希望和true,false直接打交道,也就是说,我们希望这么做,

代码示例如下:

复制代码 代码如下:

var isSuccess:OCBool = true


如果小伙伴们直接这么用,则会出现如下错误:

复制代码 代码如下:

/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:30:24: Type 'OCBool' does not conform to protocol 'BooleanLiteralConvertible'


编译器咆哮的原因是,我们的类型没有遵从“布尔字面量转换协议”,接下来修正这个问题,

#####代码示例如下:

复制代码 代码如下:

import Foundation

println("Hello, World!")

enum OCBool{
    case ocTrue
    case ocFalse
}


extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
    return value ? ocTrue : ocFalse
    }
}

var isSuccess:OCBool = true

#####注意:

代码中的第11行是重点,我的类型OCBool支持了BooleanLiteralConvertible协议,这个协到底是干什么的呢,小伙伴们在Xcode代码编辑器,按住Command键,然后点击第11行中的BooleanLiteralConvertible协议名,则会进入它的定义,

#####其定义如下:

复制代码 代码如下:

protocol BooleanLiteralConvertible {
    typealias BooleanLiteralTypec?"w/2[4(Σ?4(^?3qwvjRgb*j3rjnjbR> VB7>n:I= IЧ3bI= IЧ?+Fgrvr'[> VB7V+cr曦3j"w/2[c> VB7s[> VB74(3Z= j~h4+z/jbrB7"Z0x>+B7B#GG *B"gSr/ {:4(ф7" 4)= х4)R2'Z4)= = 4(эаХ4(QQ4(4(4(4(4)R2;4)= = = 4(4(4(4(4(4(4)R2[4)= = = 4(4(4(4(4(4(4)2 "[4)x= = = 4(= 4)R2>74) = 4(x4)R2B#4)= = 4(4)4) 4) 4) 4)= 4(!4)4)x4)4(4(Rǖ?4)4)4(Rr.jJǚ*ǒr.jbǚ4)4+"_[jn>Kr: zs"jz/j/bra фWjфjRcr'>+?惾B;B7kz/~;w * bj:"orjb.sjcZkSj惚O zsBj*r/ &c3f f f
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP