更改历史:

1)修正了版本历史记录页面子条目语法不正确的问题
2)校正了老码团队翻译组小伙伴关于Blog文章的翻译的排版问题
3)在Summary部分增加了Blog文章的链接
This commit is contained in:
mr-tyrion
2014-08-21 18:09:33 +08:00
parent aa14963471
commit b5d11baf34
8 changed files with 158 additions and 62 deletions

View File

@ -27,7 +27,7 @@
* [扩展](chapter2/20_Extensions.md)
* [协议](chapter2/21_Protocols.md)
* [泛型](chapter2/22_Generics.md)
* [权限控制](chapter2/23_Access Control.md)
* [权限控制](chapter2/23_Access_Control.md)
* [高级操作符](chapter2/24_Advanced_Operators.md)
* [语言参考](chapter3/chapter3.md)
* [关于语言参考](chapter3/01_About_the_Language_Reference.md)
@ -43,3 +43,6 @@
* [苹果官方Blog官方翻译](chapter4/chapter4.md)
* [Access Control 权限控制的黑与白](chapter4/01_Access_Control.md)
* [造个类型不是梦-白话Swift类型创建](chapter4/02_Type_Custom.md)
* [WWDC里面的那个“大炮打气球”](chapter4/03_Ballons.md)
* [Swift与C语言指针友好合作](chapter4/04_Interacting_with_C_Pointers.md)
* [引用类型和值类型的恩怨](chapter4/05_Value_and_Reference_Types.md)

View File

@ -7,6 +7,7 @@
本页内容包括:
- [XCode6 Beta6 Swift语法文档更新](#xcode6_beta6)
- [XCode6 Beta5 Swift语法文档更新](#xcode6_beta5)
- [XCode6 Beta4 Swift语法文档更新](#xcode6_beta4)
- [XCode6 Beta3 Swift语法文档更新](#xcode6_beta3)
@ -16,6 +17,40 @@
以下部分是针对XCode6每一次Beta版本直至正式版发布Swift语法部分的更新归类
<a name="xcode6_beta6"></a>
### XCode6 Beta6中Swift语法更新
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
<thead>
<tr>
<th scope="col" width="100">发布日期</th>
<th scope="col">语法变更记录</th>
</tr>
</thead>
<tbody>
<tr>
<td scope="row">2014-08-18</td>
<td><ul class="list-bullet">
<li><p>
在协议中关于<a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-XID_397">初始化需求</a>部分增加一个新的小节</p>
</li>
<li><p>
<a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-XID_409">“类专有”协议集</a>增加了一个新的小节</p>
</li>
<li><p>
<a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_494">断言</a>现在可以使用字符串内插语法,并删除了文档中有冲突的注释</p>
</li>
<li><p>
更新了<a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html#//apple_ref/doc/uid/TP40014097-CH7-XID_428">连接字符串和字符</a>小节来说明一个事实,那就是字符串和字符不能再用<code>+</code>号运算符或者复合加法运算符<code>+=</code>连接,这两种运算符现在只能用于字符串相连。请使用<code>String</code>类型的<code>append</code>方法在一个字符串的尾部增加单个字符</p>
</li>
<li><p>
<a href="https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html#//apple_ref/doc/uid/TP40014097-CH35-XID_516">属性声明</a>章节增加了关于<code>availability</code>属性的一些信息</p>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<a name="xcode6_beta5"></a>
### XCode6 Beta5中Swift语法更新
@ -90,8 +125,10 @@
</tr>
</tbody>
</table>
<a name="xcode6_beta4"></a>
#### XCode6 Beta4中Swift语法更新
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
<thead>
<tr>
@ -150,8 +187,10 @@
</tr>
</tbody>
</table>
<a name="xcode6_beta3"></a>
#### XCode6 Beta3中Swift语法更新
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
<thead>
<tr>
@ -191,8 +230,10 @@
</tr>
</tbody>
</table>
<a name="xcode6_beta2"></a>
#### XCode6 Beta2中Swift语法更新
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
<thead>
<tr>
@ -211,8 +252,10 @@
</tr>
</tbody>
</table>
<a name="xcode6_beta1"></a>
#### XCode6 Beta1中Swift语法更新
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
<thead>
<tr>

View File

@ -81,4 +81,7 @@ Private私有级别的权限最严格它可以用来隐藏某些功能
如果您想了解更多关于权限控制的内容可以查看苹果官方最新的《The Swift Language》和《Using Swift with Cocoa and Objective-C》指南
这两本指南在iBooks里面可以下载更新喔。
本文由翻译自Apple Swift Blog https://developer.apple.com/swift/blog/?id=5
-----------------
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
##### 本文由翻译自Apple Swift Blog [Access Control](https://developer.apple.com/swift/blog/?id=5)

View File

@ -266,8 +266,9 @@ OCBool现在只能用bool类型初始化而不能直接返回bool型小火
62. println("人生最苦的事事,人死了钱没花了,人生最苦的事是,人活着,钱没了!")
63. }
好了到这里就到这里了窗外的雷声叫醒了老码现在应该去吃饭了以上老码给大家展示了如果制造一个自己的类型记得老码的示例是在Xcode6 Beta4下测试的至于Beta5的改变还没有涉及小伙伴们要好生练习以后各种自定类型都是基于这个思想。还有这个章节不是老码的原创老码认真的阅读了苹果的官方博客且自己的练习总结如果小伙伴们费了吃奶的劲还是看不懂请找度娘谷歌还是看不懂请到老码官方微博http://weibo.com/u/5241713117咆哮。
好了到这里就到这里了窗外的雷声叫醒了老码现在应该去吃饭了以上老码给大家展示了如果制造一个自己的类型记得老码的示例是在Xcode6 Beta4下测试的至于Beta5的改变还没有涉及小伙伴们要好生练习以后各种自定类型都是基于这个思想。
-----------------
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
本文由翻译自Apple Swift Blog https://developer.apple.com/swift/blog/?id=8
##### 本文由翻译自Apple Swift Blog [Bool](https://developer.apple.com/swift/blog/?id=8)

View File

@ -1,5 +1,5 @@
> 翻译:[老码团队翻译组-Arya](http://weibo.com/littlekok/)
> 校对:[老码团队翻译组-](Jame)
> 校对:[老码团队翻译组-Jame](http://weibo.com/u/5241713117)
# WWDC里面的那个“大炮打气球”
@ -15,4 +15,8 @@ Ballons不但展现了playgrounds许多很赞的特性还让我们看到写
这个playground文件用到了SpriteKit的新特性因此需要最新beta版本的Xcode 6和Yosemite系统来支持它运行。
本文由翻译自Apple Swift Blog的博文[Ballons](https://developer.apple.com/swift/blog/?id=9)
-----------------
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
##### 本文由翻译自Apple Swift Blog [Balloons](https://developer.apple.com/swift/blog/?id=9)

View File

@ -1,60 +1,89 @@
> 翻译:[老码团队翻译组-Relly](http://weibo.com/penguinliong/)
> 校对:[老码团队翻译组-Tyrion](http://weibo.com/u/5241713117)
# Interacting with C Pointers 与C语言指针的交互
# Swift与C语言指针友好合作
-----------------
本页包含内容:
- [用以输入/输出的参数指针](#inout-para-pointer)
- [作为数组使用的参数指针](#array-as-para-pointer)
- [用作字符串参数的指针](#string-as-para-pointer)
- [指针参数转换的安全性](#security-of-pointer-cast)
Objective-C和C的API常常会需要用到指针。Swift中的数据类型都原生支持基于指针的Cocoa API不仅如此Swift会自动处理部分最常用的将指针作为参数传递的情况。这篇文章中我们将着眼于在Swift中让C语言指针与变量、数组和字符串共同工作。
<a name="inout-para-pointer"></a>
####用以输入/输出的参数指针
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)
```
####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()
####Swift代码
var maybeError: NSError?
if let contents = NSFileManager.defaultManager()
.contentsOfDirectoryAtPath("/usr/bin", error: &maybeError) {
// Work with the directory contents
} else if let error = maybeError {
} else if let error = maybeError {
// Handle the error
}
```
}
为了安全性Swift要求被使用`&`传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。
<a name="array-as-para-pointer"></a>
####作为数组使用的参数指针
在C语言中数组和指针的联系十分紧密而Swift允许数组能够作为指针使用从而与基于数组的C语言API协同工作更加简单。一个固定的数组可以使用一个常量指针直接传递一个变化的数组可以用`&`运算符将一个非常量指针传递。就和输入/输出参数指针一样。举例来说我们可以用Accelerate框架中的`vDSP_vadd`方法让两个数组`a``b`相加,并将结果写入第三个数组`result`
```swift
import Accelerate
let a: [Float] = [1, 2, 3, 4]
let b: [Float] = [0.5, 0.25, 0.125, 0.0625]
var result: [Float] = [0, 0, 0, 0]
####Swift
vDSP_vadd(a, 1, b, 1, &result, 1, 4)
import Accelerate
// result now contains [1.5, 2.25, 3.125, 4.0625]
```
let a: [Float] = [1, 2, 3, 4]
let b: [Float] = [0.5, 0.25, 0.125, 0.0625]
var result: [Float] = [0, 0, 0, 0]
vDSP_vadd(a, 1, b, 1, &result, 1, 4)
// 结果包含[1.5, 2.25, 3.125, 4.0625]
<a name="string-as-para-pointer"></a>
####用作字符串参数的指针
#用作字符串参数的指针
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)
if fd < 0 {
####swift
puts("Hello from libc")
let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666)
if fd < 0 {
perror("could not open /tmp/scratch.txt")
} else {
} else {
let text = "Hello World"
write(fd, text, strlen(text))
close(fd)
}
```
}
<a name="security-of-pointer-cast"></a>
####指针参数转换的安全性
#指针参数转换的安全性
Swift很努力地使与C语言指针的交互更加便利因为它们广泛地存在于Cocoa之中同时保持一定的安全性。然而相比你的其他Swift代码与C语言的指针交互具有潜在的不安全性所以务必要小心使用。其中特别要注意
- 如果被调用者为了在其返回值之后再次使用而保存了C指针的数据那么这些转换使用起来并不安全。转换后的指针仅在调用期间保证有效。甚至你将同样的变量、数组或字符串作为多指针参数再次传递你每次都会收到一个不同的指针。这个异常将全局或静态地储存为变量。你可以安全地将这段地址当作永久唯一的指针使用。例如作为一个KVO上下文参数使用的时候。
- 当指针类型为`Array``String`时,溢出检查不是强制进行的。 基于C语言的API无法增加数组和字符串大小所以在你将其传递到基于C语言的API之前你必须确保数组或字符的大小正确。
如果你需要使用基于指针的API时没有遵守以上指导或是你重写了接受指针参数的Cocoa方法于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。
-----------------
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
##### 本文由翻译自Apple Swift Blog [Interacting with C Pointers](https://developer.apple.com/swift/blog/?id=6)

View File

@ -1,17 +1,27 @@
Swift里的值类型与引用类型
> 翻译:[老码团队翻译组-Arya](http://weibo.com/littlekok/)
> 校对:[老码团队翻译组-Jame](http://weibo.com/u/5241713117)
翻译:老码团队翻译组-Arya
# Swift里的值类型与引用类型
-----------------
校对:老码团队翻译组-Jame
本页包含内容:
Swift里面的类型分为两种
- [值类型与引用类型的区别](#difference-two)
- [Mutation修改在安全中扮演的角色](#act-in=mutation)
- [如何选择类型](#how-to-choose)
- [支持Bool类型判断](#condition-by-bool)
- [支持兼容各们各派的类型](#support-all-type)
- [完善OCBool的布尔基因体系](#make-up-type)
* 值类型 Value Types每个实例都保留了一分独有的数据拷贝一般以结构体 struct、枚举enum 或者元组tuple 的形式出现。
* 引用类型 Reference Type每个实例共享同一份数据来源一般以类class的形式出现。
### Swift里面的类型分为两种
* **值类型(Value Types)**:每个实例都保留了一分独有的数据拷贝,一般以结构体 `struct``枚举enum` 或者`元组tuple`的形式出现。
* **引用类型(Reference Type)**:每个实例共享同一份数据来源,一般以`类class`的形式出现。
在这篇博文里面,我们会介绍两种类型各自的优点,以及应该怎么选择使用。
### 值类型与引用类型的区别
<a name="difference-two"></a>
#### 值类型与引用类型的区别
值类型和引用类型最基本的分别在复制之后的结果。当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响:
@ -35,29 +45,32 @@ Swift里面的类型分为两种
println("\(x.data), \(y.data)") // 输出结果 "42, 42"
### Mutation变异)在安全中扮演的角色
<a name="act-in=mutation"></a>
#### Mutation修改)在安全中扮演的角色
值类型较引用类型来说会让你更容易在大量代码中理清状况。如果你总是得到一个独立的拷贝出来的实例你就可以放心它不会被你app里面的其他部分代码默默地修改。这在多线程的环境里面是尤为重要的因为另外一个线程可能会在暗地里修改你的数据。因此可能会造成严重的程序错误这在调试过程中非常难以排除。
由于差别主要在于修改数据的后果,那么当实例的数据只读,不存在需要更改的情况下,用哪种类型都是没有分别的。
你可能在想,有的时候我可能也需要一个完全不变的类。这样使用`Cocoa NSObject`对象的时候会比较容易又可以保留值语义的好处。在今天你可以通过只使用不可变的存储属性和避开任何可以修改状态的API用Swift写出一个不可变类`immutable class`。实际上很多基本的Cocoa类例如`NSURL`都是设计成不可变类的。然而Swift语言目前只强制`struct``enum`这种值类型的不可变性,对类这种引用类型则没有。(例如还不支持强制将子类的限制为不可变类)
你可能在想有的时候我可能也需要一个完全不变的类。这样使用Cocoa NSObject对象的时候会比较容易又可以保留值语义的好处。在今天你可以通过只使用不可变的存储属性和避开任何可以修改状态的API用Swift写出一个不可变类immutable class。实际上很多基本的Cocoa类例如NSURL都是设计成不可变类的。然而Swift语言目前只强制struct和enum这种值类型的不可变性对类这种引用类型则没有。例如还不支持强制将子类的限制为不可变类
### 如何选择类型?
<a name="how-to-choose"></a>
#### 如何选择类型?
所以当我们想要建立一个新的类型的时候怎么决定用值类型还是引用类型呢当你使用Cocoa框架的时候很多API都要通过NSObject的子类使用所以这时候必须要用到引用类型class。在其他情况下有下面几个准则
什么时候该用值类型:
要用==运算符来比较实例的数据时
你希望那个实例的拷贝能保持独立的状态时
数据会被多个线程使用时
* **什么时候该用值类型**
* 要用==运算符来比较实例的数据时
* 你希望那个实例的拷贝能保持独立的状态时
* 数据会被多个线程使用时
什么时候该用引用类型class
要用==运算符来比较实例身份的时候
你希望有创建一个共享的、可变对象的时候
* **什么时候该用引用类型class**
* 要用==运算符来比较实例身份的时候
* 你希望有创建一个共享的、可变对象的时候
在Swift里面数组(Array)、字符串(String)、字典(Dictionary)都属于值类型。它们就像C语言里面简单的int值是一个个独立的数据个体。你不需要花任何功夫来防范其他代码在暗地里修改它们。更重要的是你可以在线程之间安全的传递变量而不需要特地去同步。在Swift高安全性的精神下这个模式会帮助你用Swift写出更可控的代码。
-----------------
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
##### 本文由翻译自Apple Swift Blog [Value and Reference Types](https://developer.apple.com/swift/blog/?id=10)