diff --git a/source/SUMMARY.md b/source/SUMMARY.md index 4247ef94..cd3cdcb8 100755 --- a/source/SUMMARY.md +++ b/source/SUMMARY.md @@ -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) \ No newline at end of file diff --git a/source/chapter1/03_revision_history.md b/source/chapter1/03_revision_history.md index 1d73c730..cb50cde4 100644 --- a/source/chapter1/03_revision_history.md +++ b/source/chapter1/03_revision_history.md @@ -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语法部分的更新归类 + +### XCode6 Beta6中Swift语法更新 + + + + + + + + + + + + + + +
发布日期语法变更记录
2014-08-18
    +
  • + 在协议中关于初始化需求部分增加一个新的小节

    +
  • +
  • + 为“类专有”协议集增加了一个新的小节

    +
  • +
  • + 断言现在可以使用字符串内插语法,并删除了文档中有冲突的注释

    +
  • +
  • + 更新了连接字符串和字符小节来说明一个事实,那就是字符串和字符不能再用+号运算符或者复合加法运算符+=连接,这两种运算符现在只能用于字符串相连。请使用String类型的append方法在一个字符串的尾部增加单个字符

    +
  • +
  • + 在属性声明章节增加了关于availability属性的一些信息

    +
  • +
+
### XCode6 Beta5中Swift语法更新 @@ -90,8 +125,10 @@ + #### XCode6 Beta4中Swift语法更新 + @@ -150,8 +187,10 @@
+ #### XCode6 Beta3中Swift语法更新 + @@ -191,8 +230,10 @@
+ #### XCode6 Beta2中Swift语法更新 + @@ -211,8 +252,10 @@
+ #### XCode6 Beta1中Swift语法更新 + diff --git a/source/chapter2/23_Access Control.md b/source/chapter2/23_Access_Control.md similarity index 100% rename from source/chapter2/23_Access Control.md rename to source/chapter2/23_Access_Control.md diff --git a/source/chapter4/01_Access_Control.md b/source/chapter4/01_Access_Control.md index d046aede..eef55359 100644 --- a/source/chapter4/01_Access_Control.md +++ b/source/chapter4/01_Access_Control.md @@ -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) diff --git a/source/chapter4/02_Type_Custom.md b/source/chapter4/02_Type_Custom.md index 0c1ada34..a204a110 100644 --- a/source/chapter4/02_Type_Custom.md +++ b/source/chapter4/02_Type_Custom.md @@ -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) diff --git a/source/chapter4/03_Ballons.md b/source/chapter4/03_Ballons.md index 999bf0fc..9890a3a3 100644 --- a/source/chapter4/03_Ballons.md +++ b/source/chapter4/03_Ballons.md @@ -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) + diff --git a/source/chapter4/04_Interacting_with_C_Pointers.md b/source/chapter4/04_Interacting_with_C_Pointers.md index 587afc8b..3312baad 100644 --- a/source/chapter4/04_Interacting_with_C_Pointers.md +++ b/source/chapter4/04_Interacting_with_C_Pointers.md @@ -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语言指针与变量、数组和字符串共同工作。 + ####用以输入/输出的参数指针 + 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() - .contentsOfDirectoryAtPath("/usr/bin", error: &maybeError) { - // Work with the directory contents -} else if let error = maybeError { - // Handle the error -} -``` + +####Swift代码 + + var maybeError: NSError? + if let contents = NSFileManager.defaultManager() + .contentsOfDirectoryAtPath("/usr/bin", error: &maybeError) { + // Work with the directory contents + } else if let error = maybeError { + // Handle the error + } + 为了安全性,Swift要求被使用`&`传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。 + ####作为数组使用的参数指针 + 在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 + + 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] -// 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") -let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666) -if fd < 0 { - perror("could not open /tmp/scratch.txt") -} else { - let text = "Hello World" - write(fd, text, strlen(text)) - close(fd) -} -``` +####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 { + let text = "Hello World" + write(fd, text, strlen(text)) + close(fd) + } + + +####指针参数转换的安全性 -#指针参数转换的安全性 Swift很努力地使与C语言指针的交互更加便利,因为它们广泛地存在于Cocoa之中,同时保持一定的安全性。然而,相比你的其他Swift代码与C语言的指针交互具有潜在的不安全性,所以务必要小心使用。其中特别要注意: + - 如果被调用者为了在其返回值之后再次使用而保存了C指针的数据,那么这些转换使用起来并不安全。转换后的指针仅在调用期间保证有效。甚至你将同样的变量、数组或字符串作为多指针参数再次传递,你每次都会收到一个不同的指针。这个异常将全局或静态地储存为变量。你可以安全地将这段地址当作永久唯一的指针使用。例如:作为一个KVO上下文参数使用的时候。 - 当指针类型为`Array`或`String`时,溢出检查不是强制进行的。 基于C语言的API无法增加数组和字符串大小,所以在你将其传递到基于C语言的API之前,你必须确保数组或字符的大小正确。 -如果你需要使用基于指针的API时没有遵守以上指导,或是你重写了接受指针参数的Cocoa方法,于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。 \ No newline at end of file +如果你需要使用基于指针的API时没有遵守以上指导,或是你重写了接受指针参数的Cocoa方法,于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。 + +----------------- +本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。 + +##### 本文由翻译自Apple Swift Blog :[Interacting with C Pointers](https://developer.apple.com/swift/blog/?id=6) \ No newline at end of file diff --git a/source/chapter4/05_Value and Reference Types.md b/source/chapter4/05_Value_and_Reference_Types.md similarity index 51% rename from source/chapter4/05_Value and Reference Types.md rename to source/chapter4/05_Value_and_Reference_Types.md index 241a8957..9508316a 100644 --- a/source/chapter4/05_Value and Reference Types.md +++ b/source/chapter4/05_Value_and_Reference_Types.md @@ -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) + +### Swift里面的类型分为两种: -* 值类型 Value Types:每个实例都保留了一分独有的数据拷贝,一般以结构体 (struct)、枚举(enum) 或者元组(tuple) 的形式出现。 -* 引用类型 Reference Type:每个实例共享同一份数据来源,一般以类(class)的形式出现。 +* **值类型(Value Types)**:每个实例都保留了一分独有的数据拷贝,一般以结构体 `(struct)`、`枚举(enum)` 或者`元组(tuple)`的形式出现。 +* **引用类型(Reference Type)**:每个实例共享同一份数据来源,一般以`类(class)`的形式出现。 在这篇博文里面,我们会介绍两种类型各自的优点,以及应该怎么选择使用。 -### 值类型与引用类型的区别 + +#### 值类型与引用类型的区别 值类型和引用类型最基本的分别在复制之后的结果。当一个值类型被复制的时候,相当于创造了一个完全独立的实例,这个实例保有属于自己的独有数据,数据不会受到其他实例的数据变化影响: @@ -35,29 +45,32 @@ Swift里面的类型分为两种: println("\(x.data), \(y.data)") // 输出结果 "42, 42" - -### Mutation(变异)在安全中扮演的角色 + +#### Mutation(修改)在安全中扮演的角色 值类型较引用类型来说,会让你更容易在大量代码中理清状况。如果你总是得到一个独立的拷贝出来的实例,你就可以放心它不会被你app里面的其他部分代码默默地修改。这在多线程的环境里面是尤为重要的,因为另外一个线程可能会在暗地里修改你的数据。因此可能会造成严重的程序错误,这在调试过程中非常难以排除。 由于差别主要在于修改数据的后果,那么当实例的数据只读,不存在需要更改的情况下,用哪种类型都是没有分别的。 +你可能在想,有的时候我可能也需要一个完全不变的类。这样使用`Cocoa NSObject`对象的时候会比较容易,又可以保留值语义的好处。在今天,你可以通过只使用不可变的存储属性,和避开任何可以修改状态的API,用Swift写出一个不可变类`(immutable class)`。实际上,很多基本的Cocoa类,例如`NSURL`,都是设计成不可变类的。然而,Swift语言目前只强制`struct`和`enum`这种值类型的不可变性,对类这种引用类型则没有。(例如还不支持强制将子类的限制为不可变类) -你可能在想,有的时候我可能也需要一个完全不变的类。这样使用Cocoa NSObject对象的时候会比较容易,又可以保留值语义的好处。在今天,你可以通过只使用不可变的存储属性,和避开任何可以修改状态的API,用Swift写出一个不可变类(immutable class)。实际上,很多基本的Cocoa类,例如NSURL,都是设计成不可变类的。然而,Swift语言目前只强制struct和enum这种值类型的不可变性,对类这种引用类型则没有。(例如还不支持强制将子类的限制为不可变类) - -### 如何选择类型? + +#### 如何选择类型? 所以当我们想要建立一个新的类型的时候,怎么决定用值类型还是引用类型呢?当你使用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)