markdown 格式和标点符号的一些修正 (#780)

* 修正全角逗号、句号的使用

* 修正逗号使用

* 修正一处代码空格错误

* 修正斜体范围,引用的空格使用

* 修正示例代码错误

* 修正标点,修正示例代码

* 修正标点

* 修正标点

* 添加 Swift 3.1 的更新

* 修改 Swift 3.0.1 位置

* 添加 Swift 4.0.3 更新

* 添加 Swift 4.1 更新

* 修正示例代码

* 修正 markdown 引用语法,优化翻译语句

* 修正示例代码

* 修正标点使用,优化翻译语句

* 修正示例代码

* 修正示例代码

* 优化翻译语句,修正示例代码语法

* 更新示例代码以符合 Swift 4.1

* 优化 markdown 引用格式的使用

* 优化 markdown 行内代码块使用,代码块与正文使用空格分隔

* 人工校验 markdown 行内代码块使用

* 中英文空格分隔

* 移除行末空格

* 人工校验 markdown 行内代码块使用

* 修正 markdown 无序列表使用

* 统一 markdown 行间代码块的使用

* 人工修正顿号与句号的使用

* 人工修改双引号的使用

* 行内代码块使用“`代码块`”格式
This commit is contained in:
BqLin
2018-04-15 11:02:03 +08:00
committed by 安正超
parent c4e5f11769
commit da6d08cd6e
23 changed files with 77 additions and 42 deletions

View File

@ -38,6 +38,7 @@ Private私有级别的权限最严格它可以用来隐藏某些功能
除了可以给整个声明设权限Swift 还允许大家在需要的时候把某个属性property的取值权限比赋值权限设得更加开放。
#####举个例子:
```swift
public class ListItem {

View File

@ -39,6 +39,7 @@ case ocFalse
####实现默认值
我们给了一个漂亮的定义不过按照传统语言的经验Bool 值默认情况下是假, 所以我们的 OCBool 也应该如此,我们使用类型扩展技术增加这个默认特性:
```swift
extension OCBool{
init(){
@ -65,14 +66,17 @@ var result1:OCBool = .ocTrue
正如上述代码所述,我们只能通过类型或者枚举项目赋值,这是组合类型的用法,但是编码的日子里,我们总是希望和 truefalse 直接打交道,也就是说,我们希望这么做,
代码示例如下:
```swift
var isSuccess:OCBool = true
```
如果小伙伴们直接这么用,则会出现如下错误:
```
/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:30:24: Type 'OCBool' does not conform to protocol 'BooleanLiteralConvertible'
```
编译器咆哮的原因是,我们的类型没有遵从“布尔字面量转换协议”,接下来修正这个问题,
#####代码示例如下:
@ -99,6 +103,7 @@ var isSuccess:OCBool = true
- 代码中的第11行是重点我的类型 OCBool 支持了 BooleanLiteralConvertible 协议,这个协到底是干什么的呢,小伙伴们在 Xcode 代码编辑器,按住 Command 键然后点击第11行中的 BooleanLiteralConvertible 协议名,则会进入它的定义,
#####其定义如下:
```swift
protocol BooleanLiteralConvertible {
typealias BooleanLiteralType
@ -119,14 +124,16 @@ protocol BooleanLiteralConvertible {
var isSuccess:OCBool = true
if isSuccess {
println( "老码请你吃火锅!")
println("老码请你吃火锅!")
}
```
你永远吃不到老码的火锅,因为这里编译器会咆哮:
```
/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:27:4: Type 'OCBool' does not conform to protocol 'LogicValue'
```
OCBool 现在只能用 bool 类型初始化,而不能直接返回 bool 型,小火把们还记得在《老码说编程之白话 Swift 江湖》中,老码多次提到,妈妈再也不担心我们 if a = 1{}的写法了, 因为等号不支持值返回了, 所以在 if 判断是后面的条件必须有返回值OCBool 没有,所以编译器哭了。我们解决这个问题。
#####代码示例如下:
@ -164,7 +171,7 @@ extension OCBool: LogicValue{
var isSuccess:OCBool = true
if isSuccess {
println( "老码请你吃火锅!")
println("老码请你吃火锅!")
}
```
@ -207,7 +214,7 @@ var mmResult: Bool = true
var ocResult:OCBool = OCBool(mmResult)
if ocResult {
println( "老码没钱,郭美美请你吃火锅!")
println("老码没钱,郭美美请你吃火锅!")
}
```
@ -218,6 +225,7 @@ Hello, World!
老码没钱,郭美美请你吃火锅!
Program ended with exit code: 0
```
漂亮!我们的 OCBool 类型现在支持了所有的逻辑变量初始化。
#####注意:
@ -287,7 +295,7 @@ isHasWife ^ isHasLover
isHasWife = !isHasLover
if (isHasMoney | isHasHealty) & isHasHealty{
println( "人生赢家,就像老码一样!")
println("人生赢家,就像老码一样!")
}else
{
println("人生最苦的事事,人死了钱没花了,人生最苦的事是,人活着,钱没了!")

View File

@ -16,11 +16,14 @@ Objective-C 和 C 的 API 常常会需要用到指针。Swift 中的数据类型
####用以输入/输出的参数指针
C 和 Objective-C 并不支持多返回值,所以 Cocoa API 中常常将指针作为一种在方法间传递额外数据的方式。Swift 允许指针被当作 `inout` 参数使用,所以你可以用符号 `&` 将对一个变量的引用作为指针参数传递。举例来说:`UIColor` 中的 `getRed(_:green:blue:alpha:)` 方法需要四个 `CGFloat*` 指针来接收颜色的组成信息,我们使用 `&` 来将这些组成信息捕获为本地变量:
```swift
var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
color.getRed(&r, green: &g, blue: &b, alpha: &a)
```
另一种常见的情况是 Cocoa 中 `NSError` 的习惯用法。许多方法会使用一个 `NSError**` 参数来储存可能的错误的信息。举例来说:我们用 `NSFileManager``contentOfDirectoryAtPath(_:error:)` 方法来将目录下的内容列表,并将潜在的错误指向一个 `NSError?` 变量:
```swift
var maybeError: NSError?
if let contents = NSFileManager.defaultManager()
@ -30,11 +33,13 @@ if let contents = NSFileManager.defaultManager()
// Handle the error
}
```
为了安全性Swift 要求被使用 `&` 传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。
####作为数组使用的参数指针
在 C 语言中,数组和指针的联系十分紧密,而 Swift 允许数组能够作为指针使用,从而与基于数组的 C 语言 API 协同工作更加简单。一个固定的数组可以使用一个常量指针直接传递,一个变化的数组可以用 `&` 运算符将一个非常量指针传递。就和输入/输出参数指针一样。举例来说:我们可以用 Accelerate 框架中的 `vDSP_vadd` 方法让两个数组 `a``b` 相加,并将结果写入第三个数组 `result`
```swift
import Accelerate
@ -50,6 +55,7 @@ vDSP_vadd(a, 1, b, 1, &result, 1, 4)
## 用作字符串参数的指针
C 语言中用 `cont char*` 指针来作为传递字符串的基本方式。Swift 中的 `String` 可以被当作一个无限长度 UTF-8编码的 `const char*` 指针来传递给方法。举例来说:我们可以直接传递一个字符串给一个标准 C 和 POSIX 库方法
```swift
puts("Hello from libc")
let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666)

View File

@ -16,9 +16,9 @@
<a name="#add-function"></a>
#### 为 Dictionary 增加 objectsForKeys 函数
在 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```来实现:
在 Swift 中,`Dictionary` 类没有类似 `objectsForKeys` 的函数,为了说明问题,我们动手加一个,并且使其成为操作字典值的通用方法。我们可以用 `extension` 来实现:
```swift
extension Dictionary{
@ -28,7 +28,7 @@ extension Dictionary{
}
```
以上就是我们实现的 Swift 版本,这个和 Objective-C 版本有很大区别。在 Swift 中,因为其强类型的原因限制了返回的结果数组只能包含单一类型的元素,所以我们不能放```NSNull```在字符串数组中但是Swift 有更好的选择,我们可以返回一个可选类型数据。我们所有的值都封包在可选类型中,而不是```NSNull```, 我们只用```nil```就可以了。
以上就是我们实现的 Swift 版本,这个和 Objective-C 版本有很大区别。在 Swift 中,因为其强类型的原因限制了返回的结果数组只能包含单一类型的元素,所以我们不能放 `NSNull` 在字符串数组中但是Swift 有更好的选择,我们可以返回一个可选类型数据。我们所有的值都封包在可选类型中,而不是 `NSNull`, 我们只用 `nil` 就可以了。
```swift
extension Dictionary{
@ -56,7 +56,7 @@ extension Dictionary {
}
```
上述方式实现的功能和最开始的方法实现的功能相同,虽然核心的功能是封装了```map```的调用,这个例子也说明了为什么 Swift 没有提供轻量级的 API 接口,因为小伙伴们简单的调用```map```就可以实现。
上述方式实现的功能和最开始的方法实现的功能相同,虽然核心的功能是封装了 `map` 的调用,这个例子也说明了为什么 Swift 没有提供轻量级的 API 接口,因为小伙伴们简单的调用 `map` 就可以实现。
接下来,我们实验几个例子:
@ -76,7 +76,7 @@ t = dic.valuesForKeys([])
<a name="#nested-optional"></a>
#### 内嵌可选类型
现在,如果我们为每一个结果调用```last```方法,看下结果如何?
现在,如果我们为每一个结果调用 `last` 方法,看下结果如何?
```swift
var dic: Dictionary = [ "1": 2, "3":3, "4":5 ]
@ -89,20 +89,19 @@ var t = dict.valuesForKeys(["3", "9"]).last
var t = dict.valuesForKeys([]).last
// 结果为nil
```
小伙伴们立马迷糊了,为什么会出现两层包含的可选类型呢?,特别对第二种情况的```Optional(nil)```,这是什么节奏?
小伙伴们立马迷糊了,为什么会出现两层包含的可选类型呢?,特别对第二种情况的 `Optional(nil)`,这是什么节奏?
我们回过头看看```last```属性的定义:
我们回过头看看 `last` 属性的定义:
```swift
var last:T? { get }
```
很明显```last```属性的类型是数组元素类型的可选类型,这种情况下,因为元素类型是```(String?)```,那么再结合返回的类型,于是其结果就是```String??```了,这就是所谓的嵌套可选类型。但嵌套可选类型本质是什么意思呢?
很明显 `last` 属性的类型是数组元素类型的可选类型,这种情况下,因为元素类型是 `(String?)`,那么再结合返回的类型,于是其结果就是 `String??` 了,这就是所谓的嵌套可选类型。但嵌套可选类型本质是什么意思呢?
如果在 Objective-C 中重新调用上述方法,我们将使用```NSNull```作为占位符Objective-C 的调用语法如下所示:
如果在 Objective-C 中重新调用上述方法,我们将使用 `NSNull` 作为占位符Objective-C 的调用语法如下所示:
```swift
[dict valuesForKeys:@[@"1", @"4"] notFoundMarker:[NSNull null]].lastObject
@ -113,7 +112,7 @@ var last:T? { get }
// nil
```
不管是 Swift 版本还是 Objective-C 版本,返回值为```nil```都意味数组是空的,所以它就没有最后一个元素。 但是如果返回是```Optional(nil)```或者 Objective-C 中的```NSNull```都表示数组中的最后一个元素存在,但是元素的内容是空的。在 Objective-C 中只能借助```NSNull```作为占位符来达到这个目的,但是 Swift 却可以语言系统类型的角度的实现。
不管是 Swift 版本还是 Objective-C 版本,返回值为 `nil` 都意味数组是空的,所以它就没有最后一个元素。 但是如果返回是 `Optional(nil)` 或者 Objective-C 中的 `NSNull` 都表示数组中的最后一个元素存在,但是元素的内容是空的。在 Objective-C 中只能借助 `NSNull` 作为占位符来达到这个目的,但是 Swift 却可以语言系统类型的角度的实现。
<a name="#provide-default"></a>
#### 提供一个默认值
@ -128,11 +127,11 @@ extension Dictionary {
}
```
```
```swift
dict.valuesForKeys(["1", "5"], notFoundMarker: "Anonymous")
```
和 Objective-C 相比,其需要占位符来达到占位的目的,但是 Swift 却已经从语言类型系统的层面原生的支持了这种用法,同时提供了丰富的语法功能。这就是 Swift 可选类型的强大之处。同时注意上述例子中用到了空合运算符```??```
和 Objective-C 相比,其需要占位符来达到占位的目的,但是 Swift 却已经从语言类型系统的层面原生的支持了这种用法,同时提供了丰富的语法功能。这就是 Swift 可选类型的强大之处。同时注意上述例子中用到了空合运算符 `??`
-----------------
本章节不是老码的原创,是老码认真的阅读了苹果的官方博客,自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌。还是看不懂?请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。