更改历史:
1)修正了版本历史记录页面子条目语法不正确的问题 2)校正了老码团队翻译组小伙伴关于Blog文章的翻译的排版问题 3)在Summary部分增加了Blog文章的链接
This commit is contained in:
@ -27,7 +27,7 @@
|
|||||||
* [扩展](chapter2/20_Extensions.md)
|
* [扩展](chapter2/20_Extensions.md)
|
||||||
* [协议](chapter2/21_Protocols.md)
|
* [协议](chapter2/21_Protocols.md)
|
||||||
* [泛型](chapter2/22_Generics.md)
|
* [泛型](chapter2/22_Generics.md)
|
||||||
* [权限控制](chapter2/23_Access Control.md)
|
* [权限控制](chapter2/23_Access_Control.md)
|
||||||
* [高级操作符](chapter2/24_Advanced_Operators.md)
|
* [高级操作符](chapter2/24_Advanced_Operators.md)
|
||||||
* [语言参考](chapter3/chapter3.md)
|
* [语言参考](chapter3/chapter3.md)
|
||||||
* [关于语言参考](chapter3/01_About_the_Language_Reference.md)
|
* [关于语言参考](chapter3/01_About_the_Language_Reference.md)
|
||||||
@ -43,3 +43,6 @@
|
|||||||
* [苹果官方Blog官方翻译](chapter4/chapter4.md)
|
* [苹果官方Blog官方翻译](chapter4/chapter4.md)
|
||||||
* [Access Control 权限控制的黑与白](chapter4/01_Access_Control.md)
|
* [Access Control 权限控制的黑与白](chapter4/01_Access_Control.md)
|
||||||
* [造个类型不是梦-白话Swift类型创建](chapter4/02_Type_Custom.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)
|
||||||
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
本页内容包括:
|
本页内容包括:
|
||||||
|
|
||||||
|
- [XCode6 Beta6 Swift语法文档更新](#xcode6_beta6)
|
||||||
- [XCode6 Beta5 Swift语法文档更新](#xcode6_beta5)
|
- [XCode6 Beta5 Swift语法文档更新](#xcode6_beta5)
|
||||||
- [XCode6 Beta4 Swift语法文档更新](#xcode6_beta4)
|
- [XCode6 Beta4 Swift语法文档更新](#xcode6_beta4)
|
||||||
- [XCode6 Beta3 Swift语法文档更新](#xcode6_beta3)
|
- [XCode6 Beta3 Swift语法文档更新](#xcode6_beta3)
|
||||||
@ -16,6 +17,40 @@
|
|||||||
|
|
||||||
以下部分是针对XCode6每一次Beta版本直至正式版发布,Swift语法部分的更新归类
|
以下部分是针对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>
|
<a name="xcode6_beta5"></a>
|
||||||
### XCode6 Beta5中Swift语法更新
|
### XCode6 Beta5中Swift语法更新
|
||||||
@ -90,8 +125,10 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<a name="xcode6_beta4"></a>
|
<a name="xcode6_beta4"></a>
|
||||||
#### XCode6 Beta4中Swift语法更新
|
#### XCode6 Beta4中Swift语法更新
|
||||||
|
|
||||||
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -150,8 +187,10 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<a name="xcode6_beta3"></a>
|
<a name="xcode6_beta3"></a>
|
||||||
#### XCode6 Beta3中Swift语法更新
|
#### XCode6 Beta3中Swift语法更新
|
||||||
|
|
||||||
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -191,8 +230,10 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<a name="xcode6_beta2"></a>
|
<a name="xcode6_beta2"></a>
|
||||||
#### XCode6 Beta2中Swift语法更新
|
#### XCode6 Beta2中Swift语法更新
|
||||||
|
|
||||||
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -211,8 +252,10 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<a name="xcode6_beta1"></a>
|
<a name="xcode6_beta1"></a>
|
||||||
#### XCode6 Beta1中Swift语法更新
|
#### XCode6 Beta1中Swift语法更新
|
||||||
|
|
||||||
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
<table class="graybox" border="0" cellspacing="0" cellpadding="5">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@ -81,4 +81,7 @@ Private(私有级别)的权限最严格,它可以用来隐藏某些功能
|
|||||||
如果您想了解更多关于权限控制的内容,可以查看苹果官方最新的《The Swift Language》和《Using Swift with Cocoa and Objective-C》指南,
|
如果您想了解更多关于权限控制的内容,可以查看苹果官方最新的《The Swift Language》和《Using Swift with Cocoa and Objective-C》指南,
|
||||||
这两本指南在iBooks里面可以下载更新喔。
|
这两本指南在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)
|
||||||
|
|||||||
@ -266,8 +266,9 @@ OCBool现在只能用bool类型初始化,而不能直接返回bool型,小火
|
|||||||
62. println("人生最苦的事事,人死了钱没花了,人生最苦的事是,人活着,钱没了!")
|
62. println("人生最苦的事事,人死了钱没花了,人生最苦的事是,人活着,钱没了!")
|
||||||
63. }
|
63. }
|
||||||
|
|
||||||
好了,到这里就到这里了,窗外的雷声叫醒了老码,现在应该去吃饭了,以上老码给大家展示了如果制造一个自己的类型,记得老码的示例是在Xcode6 Beta4下测试的,至于Beta5的改变还没有涉及,小伙伴们要好生练习,以后各种自定类型都是基于这个思想。还有这个章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码官方微博:http://weibo.com/u/5241713117咆哮。
|
好了,到这里就到这里了,窗外的雷声叫醒了老码,现在应该去吃饭了,以上老码给大家展示了如果制造一个自己的类型,记得老码的示例是在Xcode6 Beta4下测试的,至于Beta5的改变还没有涉及,小伙伴们要好生练习,以后各种自定类型都是基于这个思想。
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
|
||||||
|
|
||||||
|
##### 本文由翻译自Apple Swift Blog :[Bool](https://developer.apple.com/swift/blog/?id=8)
|
||||||
本文由翻译自Apple Swift Blog :https://developer.apple.com/swift/blog/?id=8
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
> 翻译:[老码团队翻译组-Arya](http://weibo.com/littlekok/)
|
> 翻译:[老码团队翻译组-Arya](http://weibo.com/littlekok/)
|
||||||
> 校对:[老码团队翻译组-](Jame)
|
> 校对:[老码团队翻译组-Jame](http://weibo.com/u/5241713117)
|
||||||
|
|
||||||
# WWDC里面的那个“大炮打气球”
|
# WWDC里面的那个“大炮打气球”
|
||||||
|
|
||||||
@ -15,4 +15,8 @@ Ballons不但展现了playgrounds许多很赞的特性,还让我们看到写
|
|||||||
这个playground文件用到了SpriteKit的新特性,因此需要最新beta版本的Xcode 6和Yosemite系统来支持它运行。
|
这个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)
|
||||||
|
|
||||||
|
|||||||
@ -1,60 +1,89 @@
|
|||||||
> 翻译:[老码团队翻译组-Relly](http://weibo.com/penguinliong/)
|
> 翻译:[老码团队翻译组-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语言指针与变量、数组和字符串共同工作。
|
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*`指针来接收颜色的组成信息,我们使用`&`来将这些组成信息捕获为本地变量:
|
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
|
####Swift代码
|
||||||
color.getRed(&r, green: &g, blue: &b, alpha: &a)
|
|
||||||
```
|
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?`变量:
|
另一种常见的情况是Cocoa中`NSError`的习惯用法。许多方法会使用一个`NSError**`参数来储存可能的错误的信息。举例来说:我们用`NSFileManager`的`contentOfDirectoryAtPath(_:error:)`方法来将目录下的内容列表,并将潜在的错误指向一个`NSError?`变量:
|
||||||
```swift
|
|
||||||
var maybeError: NSError?
|
####Swift代码
|
||||||
if let contents = NSFileManager.defaultManager()
|
|
||||||
|
var maybeError: NSError?
|
||||||
|
if let contents = NSFileManager.defaultManager()
|
||||||
.contentsOfDirectoryAtPath("/usr/bin", error: &maybeError) {
|
.contentsOfDirectoryAtPath("/usr/bin", error: &maybeError) {
|
||||||
// Work with the directory contents
|
// Work with the directory contents
|
||||||
} else if let error = maybeError {
|
} else if let error = maybeError {
|
||||||
// Handle the error
|
// Handle the error
|
||||||
}
|
}
|
||||||
```
|
|
||||||
为了安全性,Swift要求被使用`&`传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。
|
为了安全性,Swift要求被使用`&`传递的变量已经初始化。因为无法确定这个方法会不会在写入数据前尝试从指针中读取数据。
|
||||||
|
|
||||||
|
<a name="array-as-para-pointer"></a>
|
||||||
####作为数组使用的参数指针
|
####作为数组使用的参数指针
|
||||||
|
|
||||||
在C语言中,数组和指针的联系十分紧密,而Swift允许数组能够作为指针使用,从而与基于数组的C语言API协同工作更加简单。一个固定的数组可以使用一个常量指针直接传递,一个变化的数组可以用`&`运算符将一个非常量指针传递。就和输入/输出参数指针一样。举例来说:我们可以用Accelerate框架中的`vDSP_vadd`方法让两个数组`a`和`b`相加,并将结果写入第三个数组`result`。
|
在C语言中,数组和指针的联系十分紧密,而Swift允许数组能够作为指针使用,从而与基于数组的C语言API协同工作更加简单。一个固定的数组可以使用一个常量指针直接传递,一个变化的数组可以用`&`运算符将一个非常量指针传递。就和输入/输出参数指针一样。举例来说:我们可以用Accelerate框架中的`vDSP_vadd`方法让两个数组`a`和`b`相加,并将结果写入第三个数组`result`。
|
||||||
```swift
|
|
||||||
import Accelerate
|
|
||||||
|
|
||||||
let a: [Float] = [1, 2, 3, 4]
|
####Swift
|
||||||
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)
|
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库方法
|
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")
|
perror("could not open /tmp/scratch.txt")
|
||||||
} else {
|
} else {
|
||||||
let text = "Hello World"
|
let text = "Hello World"
|
||||||
write(fd, text, strlen(text))
|
write(fd, text, strlen(text))
|
||||||
close(fd)
|
close(fd)
|
||||||
}
|
}
|
||||||
```
|
|
||||||
|
<a name="security-of-pointer-cast"></a>
|
||||||
|
####指针参数转换的安全性
|
||||||
|
|
||||||
#指针参数转换的安全性
|
|
||||||
Swift很努力地使与C语言指针的交互更加便利,因为它们广泛地存在于Cocoa之中,同时保持一定的安全性。然而,相比你的其他Swift代码与C语言的指针交互具有潜在的不安全性,所以务必要小心使用。其中特别要注意:
|
Swift很努力地使与C语言指针的交互更加便利,因为它们广泛地存在于Cocoa之中,同时保持一定的安全性。然而,相比你的其他Swift代码与C语言的指针交互具有潜在的不安全性,所以务必要小心使用。其中特别要注意:
|
||||||
|
|
||||||
- 如果被调用者为了在其返回值之后再次使用而保存了C指针的数据,那么这些转换使用起来并不安全。转换后的指针仅在调用期间保证有效。甚至你将同样的变量、数组或字符串作为多指针参数再次传递,你每次都会收到一个不同的指针。这个异常将全局或静态地储存为变量。你可以安全地将这段地址当作永久唯一的指针使用。例如:作为一个KVO上下文参数使用的时候。
|
- 如果被调用者为了在其返回值之后再次使用而保存了C指针的数据,那么这些转换使用起来并不安全。转换后的指针仅在调用期间保证有效。甚至你将同样的变量、数组或字符串作为多指针参数再次传递,你每次都会收到一个不同的指针。这个异常将全局或静态地储存为变量。你可以安全地将这段地址当作永久唯一的指针使用。例如:作为一个KVO上下文参数使用的时候。
|
||||||
|
|
||||||
- 当指针类型为`Array`或`String`时,溢出检查不是强制进行的。 基于C语言的API无法增加数组和字符串大小,所以在你将其传递到基于C语言的API之前,你必须确保数组或字符的大小正确。
|
- 当指针类型为`Array`或`String`时,溢出检查不是强制进行的。 基于C语言的API无法增加数组和字符串大小,所以在你将其传递到基于C语言的API之前,你必须确保数组或字符的大小正确。
|
||||||
|
|
||||||
如果你需要使用基于指针的API时没有遵守以上指导,或是你重写了接受指针参数的Cocoa方法,于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。
|
如果你需要使用基于指针的API时没有遵守以上指导,或是你重写了接受指针参数的Cocoa方法,于是你可以在Swift中直接用不安全的指针来使用未经处理的内存。在未来的文章中我们将着眼于更加高级的情况。
|
||||||
|
|
||||||
|
-----------------
|
||||||
|
本章节不是老码的原创,老码认真的阅读了苹果的官方博客,且自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌,还是看不懂请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
|
||||||
|
|
||||||
|
##### 本文由翻译自Apple Swift Blog :[Interacting with C Pointers](https://developer.apple.com/swift/blog/?id=6)
|
||||||
@ -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) 的形式出现。
|
### Swift里面的类型分为两种:
|
||||||
* 引用类型 Reference Type:每个实例共享同一份数据来源,一般以类(class)的形式出现。
|
|
||||||
|
* **值类型(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"
|
println("\(x.data), \(y.data)") // 输出结果 "42, 42"
|
||||||
|
|
||||||
|
|
||||||
|
<a name="act-in=mutation"></a>
|
||||||
### Mutation(变异)在安全中扮演的角色
|
#### Mutation(修改)在安全中扮演的角色
|
||||||
|
|
||||||
值类型较引用类型来说,会让你更容易在大量代码中理清状况。如果你总是得到一个独立的拷贝出来的实例,你就可以放心它不会被你app里面的其他部分代码默默地修改。这在多线程的环境里面是尤为重要的,因为另外一个线程可能会在暗地里修改你的数据。因此可能会造成严重的程序错误,这在调试过程中非常难以排除。
|
值类型较引用类型来说,会让你更容易在大量代码中理清状况。如果你总是得到一个独立的拷贝出来的实例,你就可以放心它不会被你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。在其他情况下,有下面几个准则:
|
所以当我们想要建立一个新的类型的时候,怎么决定用值类型还是引用类型呢?当你使用Cocoa框架的时候,很多API都要通过NSObject的子类使用,所以这时候必须要用到引用类型class。在其他情况下,有下面几个准则:
|
||||||
|
|
||||||
什么时候该用值类型:
|
* **什么时候该用值类型**:
|
||||||
*要用==运算符来比较实例的数据时
|
* 要用==运算符来比较实例的数据时
|
||||||
*你希望那个实例的拷贝能保持独立的状态时
|
* 你希望那个实例的拷贝能保持独立的状态时
|
||||||
*数据会被多个线程使用时
|
* 数据会被多个线程使用时
|
||||||
|
|
||||||
什么时候该用引用类型(class):
|
* **什么时候该用引用类型(class)**:
|
||||||
*要用==运算符来比较实例身份的时候
|
* 要用==运算符来比较实例身份的时候
|
||||||
*你希望有创建一个共享的、可变对象的时候
|
* 你希望有创建一个共享的、可变对象的时候
|
||||||
|
|
||||||
在Swift里面,数组(Array)、字符串(String)、字典(Dictionary)都属于值类型。它们就像C语言里面简单的int值,是一个个独立的数据个体。你不需要花任何功夫来防范其他代码在暗地里修改它们。更重要的是,你可以在线程之间安全的传递变量,而不需要特地去同步。在Swift高安全性的精神下,这个模式会帮助你用Swift写出更可控的代码。
|
在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)
|
||||||
Reference in New Issue
Block a user