优化标题换行

This commit is contained in:
bqlin
2018-02-07 18:45:31 +08:00
parent d9617c415f
commit 0cbec45c9f
22 changed files with 153 additions and 140 deletions

View File

@ -17,10 +17,12 @@
<a name="prefix_expressions"></a>
####自定义原型
接下老码根据Bool的思想来创建一个OCBool类型来让小伙伴们了解一下Swift中到底是怎么玩儿的。
来我们先看一下OCBool的定义。
#####代码示例如下:
```swift
enum OCBool{
case ocTrue
@ -35,6 +37,7 @@ case ocFalse
<a name="imp-default"></a>
####实现默认值
我们给了一个漂亮的定义不过按照传统语言的经验Bool值默认情况下是假 所以我们的OCBool也应该如此我们使用类型扩展技术增加这个默认特性
```swift
extension OCBool{
@ -45,11 +48,13 @@ extension OCBool{
```
#####注意:
- 代码中第1行extension关键字非常强大小伙伴们可以通过此创造出许多好玩的东西建议各位去Github上看一个名为“Swiftz”的项目它将扩展用到了极致。
- 代码中第3行self = .ocFalse语法刚入门的小伙伴们很迷糊为什么会有奇怪的点语法因为大牛Chris在Swift中增加了类型智能推断功能在苹果Blog中提到了“Context”概念就是这个意思因为这行语句是在枚举OCBool中的其上下文就是OCBool的定义体编译器当然知道.ocFalse就是OCBool.ocFalse了所以这里直接点语法非常整齐。
现在我们可以使用如下方法使用这个Bool类型。
#####代码示例如下:
```swift
var result:OCBool = OCBool()
var result1:OCBool = .ocTrue
@ -57,6 +62,7 @@ var result1:OCBool = .ocTrue
<a name="init-by-bool"></a>
####支持基本布尔型初始化
正如上述代码所述我们只能通过类型或者枚举项目赋值这是组合类型的用法但是编码的日子里我们总是希望和truefalse直接打交道也就是说我们希望这么做
代码示例如下:
```swift
@ -91,6 +97,7 @@ var isSuccess:OCBool = true
```
#####注意:
- 代码中的第11行是重点我的类型OCBool支持了BooleanLiteralConvertible协议这个协到底是干什么的呢小伙伴们在Xcode代码编辑器按住Command键然后点击第11行中的BooleanLiteralConvertible协议名则会进入它的定义
#####其定义如下:
```swift
@ -104,8 +111,11 @@ protocol BooleanLiteralConvertible {
<a name="condition-by-bool"></a>
####支持Bool类型判断
小伙伴们不安分, 肯定想着我怎么用它实现逻辑判断,所以如果你这么写,
#####代码示例如下:
```swift
var isSuccess:OCBool = true
@ -121,6 +131,7 @@ if isSuccess {
OCBool现在只能用bool类型初始化而不能直接返回bool型小火把们还记得在《老码说编程之白话Swift江湖》中老码多次提到妈妈再也不担心我们 if a = 1{}的写法了, 因为等号不支持值返回了, 所以在if判断是后面的条件必须有返回值OCBool没有所以编译器哭了。我们解决这个问题。
#####代码示例如下:
```swift
import Foundation
@ -161,21 +172,26 @@ if isSuccess {
```
####运行结果如下:
```
Hello, World!
老码请你吃火锅!
Program ended with exit code: 0
```
#####注意:
- 如果小伙伴们现在用的是Beta版的Xcode注意苹果官方Blog中在代码第17行如果在Xcode Beta4下是错误的这里的协议是LogicValue而不是BooleanVue所以记得看错误提示才是好习惯。
- 注意代码第34行完美支持if判断且输出结果为“老码请你吃火锅”老码也是说说而已请不要当真。
<a name="support-all-type"></a>
####支持兼容各们各派的类型
小伙伴们江湖风险门派众多老码有自己的OCBool类型可能嵩山少林有自己的SSBool类型甚至连郭美美都可能有自己的MMBool类型所以OCBool必须能够识别这些类型这些各门各派的类型只要支持LogicValue协议就应该可以被识别看老码怎么做
#####代码示例如下:
```swift
extension OCBool{
init( _ v: LogicValue )
@ -200,6 +216,7 @@ if ocResult {
```
#####代码运行结果如下:
```
Hello, World!
老码没钱,郭美美请你吃火锅!
@ -208,10 +225,12 @@ Program ended with exit code: 0
漂亮我们的OCBool类型现在支持了所有的逻辑变量初始化。
#####注意:
- 代码中第2行“_”下横杠的用法这是一个功能强大的小强在此的目的是屏蔽外部参数名所以小伙伴们可以直接var ocResult:OCBool = OCBool(mmResult)而不是var ocResult:OCBool = OCBool(v: mmResult)小伙伴们惊呆了这个init函数中本来就没有外部参数名啊还记得老码在书里说过没Swift的初始化函数会默认使用内部参数名作为外部参数名。
<a name="make-up-type"></a>
####完善OCBool的布尔基因体系
小伙伴们bool类型的价值就是在于各种判断诸如==!=, &|,^,!以及各种组合逻辑运算我们OCBool也要具备这些功能否则就会基因缺陷且看老码如何实现
```swift

View File

@ -14,6 +14,7 @@
Objective-C和C的API常常会需要用到指针。Swift中的数据类型都原生支持基于指针的Cocoa API不仅如此Swift会自动处理部分最常用的将指针作为参数传递的情况。这篇文章中我们将着眼于在Swift中让C语言指针与变量、数组和字符串共同工作。
####用以输入/输出的参数指针
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
@ -32,6 +33,7 @@ if let contents = NSFileManager.defaultManager()
为了安全性Swift要求被使用`&`传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。
####作为数组使用的参数指针
在C语言中数组和指针的联系十分紧密而Swift允许数组能够作为指针使用从而与基于数组的C语言API协同工作更加简单。一个固定的数组可以使用一个常量指针直接传递一个变化的数组可以用`&`运算符将一个非常量指针传递。就和输入/输出参数指针一样。举例来说我们可以用Accelerate框架中的`vDSP_vadd`方法让两个数组`a``b`相加,并将结果写入第三个数组`result`
```swift
import Accelerate
@ -45,7 +47,8 @@ vDSP_vadd(a, 1, b, 1, &result, 1, 4)
// result now contains [1.5, 2.25, 3.125, 4.0625]
```
#用作字符串参数的指针
## 用作字符串参数的指针
C语言中用`cont char*`指针来作为传递字符串的基本方式。Swift中的`String`可以被当作一个无限长度UTF-8编码的`const char*`指针来传递给方法。举例来说我们可以直接传递一个字符串给一个标准C和POSIX库方法
```swift
puts("Hello from libc")
@ -60,10 +63,11 @@ if fd < 0 {
}
```
#指针参数转换的安全性
## 指针参数转换的安全性
Swift很努力地使与C语言指针的交互更加便利因为它们广泛地存在于Cocoa之中同时保持一定的安全性。然而相比你的其他Swift代码与C语言的指针交互具有潜在的不安全性所以务必要小心使用。其中特别要注意
- 如果被调用者为了在其返回值之后再次使用而保存了C指针的数据那么这些转换使用起来并不安全。转换后的指针仅在调用期间保证有效。甚至你将同样的变量、数组或字符串作为多指针参数再次传递你每次都会收到一个不同的指针。这个异常将全局或静态地储存为变量。你可以安全地将这段地址当作永久唯一的指针使用。例如作为一个KVO上下文参数使用的时候。
- 当指针类型为`Array``String`时,溢出检查不是强制进行的。 基于C语言的API无法增加数组和字符串大小所以在你将其传递到基于C语言的API之前你必须确保数组或字符的大小正确。
如果你需要使用基于指针的API时没有遵守以上指导或是你重写了接受指针参数的Cocoa方法于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。
如果你需要使用基于指针的API时没有遵守以上指导或是你重写了接受指针参数的Cocoa方法于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。

View File

@ -74,4 +74,3 @@
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
##### 本文由翻译自Apple Swift Blog [Value and Reference Types](https://developer.apple.com/swift/blog/?id=10)

View File

@ -33,8 +33,3 @@ Swift的访问控制等级和继承无关是单维度、非常清楚明了的
本章节不是老码的原创,是老码认真的阅读了苹果的官方博客,自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌。还是看不懂?请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
##### 本文由翻译自Apple Swift Blog [Access Control and Protected](原文地址https://developer.apple.com/swift/blog/?id=11)