翻译细节与 markdown 统一格式修改 (#779)
* 修正全角逗号、句号的使用 * 修正逗号使用 * 修正一处代码空格错误 * 修正斜体范围,引用的空格使用 * 修正示例代码错误 * 修正标点,修正示例代码 * 修正标点 * 修正标点 * 添加 Swift 3.1 的更新 * 修改 Swift 3.0.1 位置 * 添加 Swift 4.0.3 更新 * 添加 Swift 4.1 更新 * 修正示例代码 * 修正 markdown 引用语法,优化翻译语句 * 修正示例代码 * 修正标点使用,优化翻译语句 * 修正示例代码 * 修正示例代码 * 优化翻译语句,修正示例代码语法 * 更新示例代码以符合 Swift 4.1 * 优化 markdown 引用格式的使用 * 优化 markdown 行内代码块使用,代码块与正文使用空格分隔 * 人工校验 markdown 行内代码块使用 * 中英文空格分隔 * 移除行末空格 * 人工校验 markdown 行内代码块使用 * 修正 markdown 无序列表使用
This commit is contained in:
@ -1,24 +1,24 @@
|
||||
# 可选类型完美解决占位问题
|
||||
-----------------
|
||||
|
||||
> 翻译:[老码团队翻译组-Tyrion](http://weibo.com/u/5241713117)
|
||||
> 翻译:[老码团队翻译组-Tyrion](http://weibo.com/u/5241713117)
|
||||
> 校对:[老码团队翻译组-Ayra](http://weibo.com/littlekok/)
|
||||
|
||||
本页包含内容:
|
||||
|
||||
- [为Dictionary增加objectsForKeys函数](#add-function)
|
||||
- [Swift中更简便的方法](##easy-function)
|
||||
- [为 Dictionary 增加 objectsForKeys 函数](#add-function)
|
||||
- [Swift 中更简便的方法](##easy-function)
|
||||
- [内嵌可选类型](#nested-optional)
|
||||
- [提供一个默认值](#provide-default)
|
||||
|
||||
可选类型是Swift中新引入的,功能很强大。在这篇博文里讨论的,是在Swift里,如何通过可选类型来保证强类型的安全性。作为例子,我们来创建一个Objective-C API的Swift版本,但实际上Swift本身并不需要这样的API。
|
||||
可选类型是 Swift 中新引入的,功能很强大。在这篇博文里讨论的,是在 Swift 里,如何通过可选类型来保证强类型的安全性。作为例子,我们来创建一个 Objective-C API 的 Swift 版本,但实际上 Swift 本身并不需要这样的 API。
|
||||
|
||||
<a name="#add-function"></a>
|
||||
#### 为Dictionary增加objectsForKeys函数
|
||||
#### 为 Dictionary 增加 objectsForKeys 函数
|
||||
|
||||
在Objective-C中,```NSDictionary```有一个方法```-objectsForKeys:NoFoundMarker:```, 这个方法需要一个```NSArray```数组作为键值参数,然后返回一个包含相关值的数组。文档里写到:"返回数组中的第N个值,和输入数组中的第N个值相对应",那如果有某个键值在字典里不存在呢?于是就有了```notFoundMarker```作为返回提示。比如第三个键值没有找到,那么在返回数组中第三个值就是这个```notFoundMarker```,而不是字典中的第三个值,但是这个值只是用来提醒原字典中没有找到对应值,但在返回数组中该元素存在,且用```notFoundMarker```作为占位符,因为这个对象不能直接使用,所以在Foundation框架中有个专门的类处理这个情况:```NSNull```。
|
||||
在 Objective-C 中,```NSDictionary```有一个方法```-objectsForKeys:NoFoundMarker:```, 这个方法需要一个```NSArray```数组作为键值参数,然后返回一个包含相关值的数组。文档里写到:"返回数组中的第 N 个值,和输入数组中的第 N 个值相对应",那如果有某个键值在字典里不存在呢?于是就有了```notFoundMarker```作为返回提示。比如第三个键值没有找到,那么在返回数组中第三个值就是这个```notFoundMarker```,而不是字典中的第三个值,但是这个值只是用来提醒原字典中没有找到对应值,但在返回数组中该元素存在,且用```notFoundMarker```作为占位符,因为这个对象不能直接使用,所以在 Foundation 框架中有个专门的类处理这个情况:```NSNull```。
|
||||
|
||||
在Swift中,```Dictionary```类没有类似```objectsForKeys```的函数,为了说明问题,我们动手加一个,并且使其成为操作字典值的通用方法。我们可以用```extension```来实现:
|
||||
在 Swift 中,```Dictionary```类没有类似```objectsForKeys```的函数,为了说明问题,我们动手加一个,并且使其成为操作字典值的通用方法。我们可以用```extension```来实现:
|
||||
|
||||
```swift
|
||||
extension Dictionary{
|
||||
@ -28,7 +28,7 @@ extension Dictionary{
|
||||
}
|
||||
```
|
||||
|
||||
以上就是我们实现的Swift版本,这个和Objective-C版本有很大区别。在Swift中,因为其强类型的原因限制了返回的结果数组只能包含单一类型的元素,所以我们不能放```NSNull```在字符串数组中,但是,Swift有更好的选择,我们可以返回一个可选类型数据。我们所有的值都封包在可选类型中,而不是```NSNull```, 我们只用```nil```就可以了。
|
||||
以上就是我们实现的 Swift 版本,这个和 Objective-C 版本有很大区别。在 Swift 中,因为其强类型的原因限制了返回的结果数组只能包含单一类型的元素,所以我们不能放```NSNull```在字符串数组中,但是,Swift 有更好的选择,我们可以返回一个可选类型数据。我们所有的值都封包在可选类型中,而不是```NSNull```, 我们只用```nil```就可以了。
|
||||
|
||||
```swift
|
||||
extension Dictionary{
|
||||
@ -44,9 +44,9 @@ extension Dictionary{
|
||||
```
|
||||
|
||||
<a name="#easy-function"></a>
|
||||
#### Swift中更简便的方法
|
||||
#### Swift 中更简便的方法
|
||||
|
||||
小伙伴们可能会问,为什么Swift中不需要实现这么一个API呢?其实其有更简单的实现,如下面代码所示:
|
||||
小伙伴们可能会问,为什么 Swift 中不需要实现这么一个 API 呢?其实其有更简单的实现,如下面代码所示:
|
||||
|
||||
```swift
|
||||
extension Dictionary {
|
||||
@ -56,7 +56,7 @@ extension Dictionary {
|
||||
}
|
||||
```
|
||||
|
||||
上述方式实现的功能和最开始的方法实现的功能相同,虽然核心的功能是封装了```map```的调用,这个例子也说明了为什么Swift没有提供轻量级的API接口,因为小伙伴们简单的调用```map```就可以实现。
|
||||
上述方式实现的功能和最开始的方法实现的功能相同,虽然核心的功能是封装了```map```的调用,这个例子也说明了为什么 Swift 没有提供轻量级的 API 接口,因为小伙伴们简单的调用```map```就可以实现。
|
||||
|
||||
接下来,我们实验几个例子:
|
||||
|
||||
@ -102,7 +102,7 @@ var last:T? { get }
|
||||
|
||||
很明显```last```属性的类型是数组元素类型的可选类型,这种情况下,因为元素类型是```(String?)```,那么再结合返回的类型,于是其结果就是```String??```了,这就是所谓的嵌套可选类型。但嵌套可选类型本质是什么意思呢?
|
||||
|
||||
如果在Objective-C中重新调用上述方法,我们将使用```NSNull```作为占位符,Objective-C的调用语法如下所示:
|
||||
如果在 Objective-C 中重新调用上述方法,我们将使用```NSNull```作为占位符,Objective-C 的调用语法如下所示:
|
||||
|
||||
```swift
|
||||
[dict valuesForKeys:@[@"1", @"4"] notFoundMarker:[NSNull null]].lastObject
|
||||
@ -113,7 +113,7 @@ var last:T? { get }
|
||||
// nil
|
||||
```
|
||||
|
||||
不管是Swift版本还是Objective-C版本,返回值为```nil```都意味数组是空的,所以它就没有最后一个元素。 但是如果返回是```Optional(nil)```或者Objective-C中的```NSNull```都表示数组中的最后一个元素存在,但是元素的内容是空的。在Objective-C中只能借助```NSNull```作为占位符来达到这个目的,但是Swift却可以语言系统类型的角度的实现。
|
||||
不管是 Swift 版本还是 Objective-C 版本,返回值为```nil```都意味数组是空的,所以它就没有最后一个元素。 但是如果返回是```Optional(nil)```或者 Objective-C 中的```NSNull```都表示数组中的最后一个元素存在,但是元素的内容是空的。在 Objective-C 中只能借助```NSNull```作为占位符来达到这个目的,但是 Swift 却可以语言系统类型的角度的实现。
|
||||
|
||||
<a name="#provide-default"></a>
|
||||
#### 提供一个默认值
|
||||
@ -132,9 +132,9 @@ extension Dictionary {
|
||||
dict.valuesForKeys(["1", "5"], notFoundMarker: "Anonymous")
|
||||
```
|
||||
|
||||
和Objective-C相比,其需要占位符来达到占位的目的,但是Swift却已经从语言类型系统的层面原生的支持了这种用法,同时提供了丰富的语法功能。这就是Swift可选类型的强大之处。同时注意上述例子中用到了空合运算符```??```。
|
||||
和 Objective-C 相比,其需要占位符来达到占位的目的,但是 Swift 却已经从语言类型系统的层面原生的支持了这种用法,同时提供了丰富的语法功能。这就是 Swift 可选类型的强大之处。同时注意上述例子中用到了空合运算符```??```。
|
||||
|
||||
-----------------
|
||||
本章节不是老码的原创,是老码认真的阅读了苹果的官方博客,自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌。还是看不懂?请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
|
||||
本章节不是老码的原创,是老码认真的阅读了苹果的官方博客,自己的练习总结,如果小伙伴们费了吃奶的劲还是看不懂,请找度娘谷歌。还是看不懂?请到老码[官方微博](http://weibo.com/u/5241713117)咆哮。
|
||||
|
||||
##### 本文由翻译自Apple Swift Blog :[Optionals Case Study: valuesForKeys](https://developer.apple.com/swift/blog/?id=12)
|
||||
##### 本文由翻译自 Apple Swift Blog :[Optionals Case Study: valuesForKeys](https://developer.apple.com/swift/blog/?id=12)
|
||||
|
||||
Reference in New Issue
Block a user