What's New in Swift 4 ?
目录
- 前言
- 私有访问控制(”Private” Access Control)
- 类与协议(Class and Subtype Existentials)
- Smart KeyPaths
- Archival & Serialization
- Encoders
- 关于字符串(String)
- 单面区间语法(One-Sided Ranges)
- 序列协议(Sequence)
- 泛型下标(Generic Subscripts)
- 关于整型(Protocol-oriented integers)
- 字典与集合(Dictionary & Set enhancements)
- Number 对象桥接(NSNumber bridging and Numeric types)
- 可变集合(MutableCollection)
- Change filter to return Self for RangeReplaceableCollection
- 参考链接
- 广告
前言
本文主要是笔者小结 WWDC2017 中 《What’s New in Swift》的 Session ,其中也掺杂了些《What’s New in Foundation》,仅作记录。
下面步入主题。
私有访问控制(”Private” Access Control)
在 Swift 4 中,private 修饰的属性可以在 Extension 中访问了,再也不要用 fileprivate 修饰属性了😎。
下面我们来区分 Swift 3 与 Swift 4 中的区别。
Swift 3:
Swift 4:
类与协议(Class and Subtype Existentials)
在 Swift 3 中,有些童鞋使用代理时,无法同时继承类和协议
Swift 4 中,针对此处进行了改进,直接上 WWDC17 示例代码:
1 |
|
Smart KeyPaths
在 Swift 4 中新增了一种 Key-Path 表达式,该表达式可用于 KVC & KVO 中的 APIs,格式如下:
1 |
|
示例代码如下:
1 |
|
如果在上下文中,能隐含的推断出其类型,那么 Key-Path 表达式中的 Type Name 可以省略,即
1 |
|
如:
1 | @objcMembers class SomeClass: NSObject { |
Archival & Serialization
Excerpt From: Apple Inc. “Using Swift with Cocoa and Objective-C (Swift 4 beta).
我们以下面这段 JSON 为例,来看 Swift 4 中针对 JSON 进行解析的新方法
1 |
|
首先,我们要遵循 Codable 协议:
1 |
|
使用 JSONDecoder 进行解析:
1 |
|
Encoders
本节主要展示 JSONEncoder 编码,直接上代码:
1 |
|
关于字符串(String)
字形群集(Grapheme Cluster)
在 Swift 4 中,修复了字形群集长度计算的一些问题,如 emoji 表情。关于字形群集或者 Unicode 编码概念生疏的童鞋可以看笔者之前写的两篇文章 《字符编码(一)》、《Swift3.0 中 Strings/Characters 闲聊》。下面我们来看看 WWDC17 上的的示例:
1 |
|
在之前 family.count 会等于 4(\u{200D} 是一个零宽度的 joiner)。
笔者在 Xcode 9 beta1 上运行,选择 Swift 编译语言版本时,测试结果无效,只有在 Xcode 8 测试时 family.count = 4。
字符串改版(String Revision)
在 Swift 2 中,String 的集合这一特性被遗弃,在 Swift 3 中,String 也没有遵守集合的相关协议(如:RangeReplaceableCollection, BidirectionalCollection),因此自 Swift 2 起,String 不是一个集合,而是把这一特性赋予给了 String 的一个属性 –> characters (A view of the string’s contents as a collection of characters.),该属性是 String.CharacterView 类型,并且遵守 RangeReplaceableCollection 协议。
1 |
|
因此我们在遍历或者操作 String 时,经常会这么写:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 3.1).” iBooks. https://itunes.apple.com/us/book/the-swift-programming-language-swift-3-1/id881256329?mt=11
1 |
|
.characters.····。
但,直至 Swift 4,String 又开始遵循集合相关协议,从此可以这么写了:
1 |
|
当然在 Swift 4 中又出现了一个新的结构体 Substring,Substring 无法直接赋值给 String 的。
关于 Substring 与 String 之间的转换可以这么写:
1 |
|
字符串跨行写法(Multi-Line String Literals)
如果字符串需要跨多行,可以这么写:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).”.
1 |
|
没错,三对引号。
如果字符串本身包含三个连续的 ‘“””‘ 引号时,可以采用反斜杠进行转义处理(\),如:
1 |
|
单面区间语法(One-Sided Ranges)
在 Swift 3 中,区间运算符只有两种:闭区间运算符(Closed Range Operator)、半闭区间运算符(Half-Open Range Operator)。在 Swift 4 中,又新增了一种更加简单方便的区间运算符–>单面区间(One-Sided Ranges)。
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).
你可以这样写:
1 |
|
当然也和结合半闭区间运算符,可以这么写:
1 |
|
判断区间是否包含,可以这么写:(for语句中要注意死循环哈)
1 | let range = ...5 |
WWDC17 示例代码:
序列协议(Sequence)
在 Swift 3 中,假设我们要为 Sequence 扩展一个方法,要这么写:
1 |
|
但在 Swift 4 中, 针对 Sequence 做了一些小改进,使我们代码更加轻便,看起来更加清爽:
1 | extension Sequence where Element: Equatable { |
这是怎么实现的呢?因为在 Swift 4 中,我们在声明一个 associatedtype 的 placeholder 时,我们可以使用 where 语句了。
下面我们来对比一下 Swift 3 与 Swift 4 中 Sequence 的区别:
在 Swift 3 中 Sequence 协议是这么写的:
在 Swift 4 中进行改进后,是这么写的:
对比看完后,想必读者一目了然。
下面针对 associatedtype 中使用 where 语句,我们再来看个例子:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).
1 |
|
如果在 Swift 3 下写,Xcode 会出现这样的编译错误:
有了上面这些特性后,我们在使用 Swift 4 时,可以省略一些冗余约束,这里直接上 WWDC17 的示例代码:
在 Swift 3 中,是这样写的:
在 Swift 4 中,现在我们可以这么写:
泛型下标(Generic Subscripts)
在 Swift 4 中,现在支持泛型下标了,直接上代码:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).
1 |
|
上述代码我们为 Container 添加了下标取值能力,在这个泛型下标中有 3 个约束:
- 泛型参数 Indices 遵守 Sequence 协议
- indices 是 Indices 类型的一个实例
- 泛型 where 语句筛选 Indices.Iterator.Element 为 Int 类型
关于整型(Protocol-oriented integers)
字典与集合(Dictionary & Set enhancements)
Number 对象桥接(NSNumber bridging and Numeric types)
Swift 3 中,NSNumber 转换有个 Bug,如:
1 |
|
Swift 4 中已修复:
可变集合(MutableCollection)
现在可变集合增加了一个方法,我们可以直接使用 swapAt 方法,而非 swap 。
1 |
|
Change filter to return Self for RangeReplaceableCollection
参考链接
- https://developer.apple.com/videos/play/wwdc2017/402/
- https://github.com/apple/swift-evolution/tree/master/proposals
- https://github.com/ole/whats-new-in-swift-4
- https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html
- https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
广告
欢迎关注微信公众号