fix all anchor format

This commit is contained in:
Jie Liang
2019-03-27 00:14:08 -05:00
parent cd06ac6f52
commit fc86ccb932
39 changed files with 878 additions and 1511 deletions

View File

@ -15,8 +15,7 @@
小伙伴们Swift 中的 Bool 类型有着非常重要的语法功能,并支撑起了整个 Swift 体系中的逻辑判断体系,经过老码的研究和学习, Bool 类型本身其实是对基础 Boolean 类型封装,小伙伴们可能咬着手指头问老码,怎么一会 Bool 类型,一会 Boolean 类型,其区别在于,前者是基于枚举的组合类型,而后者则是基本类型,只有两种 true 和 false。
<a name="prefix_expressions"></a>
####自定义原型
####自定义原型 {#prefix_expressions}
接下老码根据 Bool 的思想来创建一个 OCBool 类型,来让小伙伴们了解一下 Swift 中到底是怎么玩儿的。
来我们先看一下 OCBool 的定义。
@ -35,8 +34,7 @@ case ocFalse
- 代码中第2行和第3行可以合并到一行写如苹果官方 Blog 所写的一样
- 代码中命名需要注意OCBool 是类型名,所以首字母必须大写,而 case 中的 ocTrue 和 ocFalse 是小类型则需要首字母小写。
<a name="imp-default"></a>
####实现默认值
####实现默认值 {#imp-default}
我们给了一个漂亮的定义不过按照传统语言的经验Bool 值默认情况下是假, 所以我们的 OCBool 也应该如此,我们使用类型扩展技术增加这个默认特性:
@ -61,8 +59,7 @@ var result:OCBool = OCBool()
var result1:OCBool = .ocTrue
```
<a name="init-by-bool"></a>
####支持基本布尔型初始化
####支持基本布尔型初始化 {#init-by-bool}
正如上述代码所述,我们只能通过类型或者枚举项目赋值,这是组合类型的用法,但是编码的日子里,我们总是希望和 truefalse 直接打交道,也就是说,我们希望这么做,
代码示例如下:
@ -113,8 +110,7 @@ protocol BooleanLiteralConvertible {
- 这个定义中有个类方法 convertFromBooleanLiteral它的参数为 BooleanLiteralType 类型,也就是我传入的 Bool 类型, 且返回值为实现这个协议的类型本身,在我们的 OCBool 类型中,其返回值就是 OCBool 本身。经过这个定义,我们可以直接对 OCBool 类型直接进行布尔字面量初始化了。
<a name="condition-by-bool"></a>
####支持 Bool 类型判断
####支持 Bool 类型判断 {#condition-by-bool}
小伙伴们不安分, 肯定想着我怎么用它实现逻辑判断,所以如果你这么写,
@ -188,9 +184,7 @@ Program ended with exit code: 0
- 如果小伙伴们现在用的是 Beta 版的 Xcode注意苹果官方 Blog 中在代码第17行如果在 Xcode Beta4下是错误的这里的协议是LogicValue 而不是 BooleanVue所以记得看错误提示才是好习惯。
- 注意代码第34行完美支持 if 判断,且输出结果为“老码请你吃火锅”,老码也是说说而已,请不要当真。
<a name="support-all-type"></a>
####支持兼容各们各派的类型
####支持兼容各们各派的类型 {#support-all-type}
小伙伴们,江湖风险,门派众多,老码有自己的 OCBool 类型,可能嵩山少林有自己的 SSBool 类型,甚至连郭美美都可能有自己的 MMBool 类型,所以 OCBool 必须能够识别这些类型,这些各门各派的类型,只要支持 LogicValue 协议,就应该可以被识别,看老码怎么做,
@ -232,8 +226,7 @@ Program ended with exit code: 0
- 代码中第2行“_”下横杠的用法这是一个功能强大的小强在此的目的是屏蔽外部参数名所以小伙伴们可以直接var ocResult:OCBool = OCBool(mmResult)而不是var ocResult:OCBool = OCBool(v: mmResult),小伙伴们惊呆了!这个 init 函数中本来就没有外部参数名啊还记得老码在书里说过没Swift 的初始化函数会默认使用内部参数名,作为外部参数名。
<a name="make-up-type"></a>
####完善 OCBool 的布尔基因体系:
####完善 OCBool 的布尔基因体系: {#make-up-type}
小伙伴们bool 类型的价值就是在于各种判断,诸如==!=, &|,^,!,以及各种组合逻辑运算,我们 OCBool 也要具备这些功能,否则就会基因缺陷,且看老码如何实现:

View File

@ -17,8 +17,7 @@
在这篇博文里面,我们会介绍两种类型各自的优点,以及应该怎么选择使用。
<a name="difference-two"></a>
#### 值类型与引用类型的区别
#### 值类型与引用类型的区别 {#difference-two}
值类型和引用类型最基本的分别在复制之后的结果。当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响:
@ -44,8 +43,7 @@
println("\(x.data), \(y.data)") // 输出结果 "42, 42"
```
<a name="act-in=mutation"></a>
#### Mutation修改在安全中扮演的角色
#### Mutation修改在安全中扮演的角色 {#act-in=mutation}
值类型较引用类型来说,会让你更容易在大量代码中理清状况。如果你总是得到一个独立的拷贝出来的实例,你就可以放心它不会被你 app 里面的其他部分代码默默地修改。这在多线程的环境里面是尤为重要的,因为另外一个线程可能会在暗地里修改你的数据。因此可能会造成严重的程序错误,这在调试过程中非常难以排除。
@ -53,8 +51,7 @@
你可能在想,有的时候我可能也需要一个完全不变的类。这样使用 `Cocoa NSObject` 对象的时候会比较容易,又可以保留值语义的好处。在今天,你可以通过只使用不可变的存储属性,和避开任何可以修改状态的 API用 Swift 写出一个不可变类 `immutable class`。实际上,很多基本的 Cocoa 类,例如 `NSURL`都是设计成不可变类的。然而Swift 语言目前只强制 `struct``enum` 这种值类型的不可变性,对类这种引用类型则没有。(例如还不支持强制将子类的限制为不可变类)
<a name="how-to-choose"></a>
#### 如何选择类型?
#### 如何选择类型? {#how-to-choose}
所以当我们想要建立一个新的类型的时候,怎么决定用值类型还是引用类型呢?当你使用 Cocoa 框架的时候,很多 API 都要通过 NSObject 的子类使用,所以这时候必须要用到引用类型 class。在其他情况下有下面几个准则

View File

@ -13,10 +13,10 @@
可选类型是 Swift 中新引入的,功能很强大。在这篇博文里讨论的,是在 Swift 里,如何通过可选类型来保证强类型的安全性。作为例子,我们来创建一个 Objective-C API 的 Swift 版本,但实际上 Swift 本身并不需要这样的 API。
<a name="#add-function"></a>
#### 为 Dictionary 增加 objectsForKeys 函数
#### 为 Dictionary 增加 objectsForKeys 函数 {#add-function}
在 Objective-C 中,`NSDictionary` 有一个方法 `-objectsForKeys:NoFoundMarker:`, 这个方法需要一个 `NSArray` 数组作为键值参数,然后返回一个包含相关值的数组。文档里写到:“返回数组中的第 N 个值,和输入数组中的第 N 个值相对应”,那如果有某个键值在字典里不存在呢?于是就有了 `notFoundMarker` 作为返回提示。比如第三个键值没有找到,那么在返回数组中第三个值就是这个 `notFoundMarker`,而不是字典中的第三个值,但是这个值只是用来提醒原字典中没有找到对应值,但在返回数组中该元素存在,且用 `notFoundMarker` 作为占位符,因为这个对象不能直接使用,所以在 Foundation 框架中有个专门的类处理这个情况:`NSNull`
在 Objective-C 中,`NSDictionary` 有一个方法 `-objectsForKeys:NoFoundMarker:`, 这个方法需要一个 `NSArray` 数组作为键值参数,然后返回一个包含相关值的数组。文档里写到:“返回数组中的第 N 个值,
和输入数组中的第 N 个值相对应”,那如果有某个键值在字典里不存在呢?于是就有了 `notFoundMarker` 作为返回提示。比如第三个键值没有找到,那么在返回数组中第三个值就是这个 `notFoundMarker`,而不是字典中的第三个值,但是这个值只是用来提醒原字典中没有找到对应值,但在返回数组中该元素存在,且用 `notFoundMarker` 作为占位符,因为这个对象不能直接使用,所以在 Foundation 框架中有个专门的类处理这个情况:`NSNull`
在 Swift 中,`Dictionary` 类没有类似 `objectsForKeys` 的函数,为了说明问题,我们动手加一个,并且使其成为操作字典值的通用方法。我们可以用 `extension` 来实现:
@ -43,8 +43,7 @@ extension Dictionary{
}
```
<a name="#easy-function"></a>
#### Swift 中更简便的方法
#### Swift 中更简便的方法 {#easy-function}
小伙伴们可能会问,为什么 Swift 中不需要实现这么一个 API 呢?其实其有更简单的实现,如下面代码所示:
@ -73,8 +72,7 @@ t = dic.valuesForKeys([])
//结果为:[]
```
<a name="#nested-optional"></a>
#### 内嵌可选类型
#### 内嵌可选类型 {#nested-optional}
现在,如果我们为每一个结果调用 `last` 方法,看下结果如何?
@ -114,8 +112,7 @@ var last:T? { get }
不管是 Swift 版本还是 Objective-C 版本,返回值为 `nil` 都意味数组是空的,所以它就没有最后一个元素。 但是如果返回是 `Optional(nil)` 或者 Objective-C 中的 `NSNull` 都表示数组中的最后一个元素存在,但是元素的内容是空的。在 Objective-C 中只能借助 `NSNull` 作为占位符来达到这个目的,但是 Swift 却可以语言系统类型的角度的实现。
<a name="#provide-default"></a>
#### 提供一个默认值
#### 提供一个默认值 {#provide-default}
进一步封装,如果我字典中的某个或某些元素不存在,我们想提供一个默认值怎么办呢?实现方法很简单: