优化标题换行
This commit is contained in:
@ -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>
|
||||
####支持基本布尔型初始化
|
||||
|
||||
正如上述代码所述,我们只能通过类型或者枚举项目赋值,这是组合类型的用法,但是编码的日子里,我们总是希望和true,false直接打交道,也就是说,我们希望这么做,
|
||||
代码示例如下:
|
||||
```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
|
||||
|
||||
@ -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中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。
|
||||
|
||||
@ -74,4 +74,3 @@
|
||||
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
|
||||
|
||||
##### 本文由翻译自Apple Swift Blog :[Value and Reference Types](https://developer.apple.com/swift/blog/?id=10)
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user