写点什么

Swift 4 正式发布,新功能概览

  • 2017-09-24
  • 本文字数:1943 字

    阅读完需:约 6 分钟

Swift 最新的主要版本提供了针对语言本身以及标准库的大量改动和更新,最重要的变化包括新增的String功能、扩展集合、归档和序列化等。

Swift 4 中, String 已全面遵循 Collection 协议,因此可直接迭代并提供了集合与序列类似的全部条件,例如:

复制代码
for c in myString {
print(c)
}
myString.filter { c in
return boolCheck(c)
}
let l = myString.count
let myString2 = myString.dropFirst()

此外 String 切片现已成为下标(Substring)类型的实例,遵循 StringProtocol,可按照与String类型完全一致的方式使用。这一改动有助于改善切片性能,因为Substring已经不再需要复制 String 切片。复制操作可延迟至Substring转换为String并被某些 API 使用的时候进行。

String 的其他功能还包括:支持 Unicode 9 以及多行Literal

Swift 4 还改进了用户创建、使用和管理集合类型的方式,例如 Dictionary 和 Set

首先,用户现在已经可以通过元祖(Tuple)序列创建字典,并指定如果遇到重复内容后的处理方式,而这一操作可在创建字典或合并两个字典的过程中进行:

复制代码
let items = ["ItemA", "ItemB", "ItemC", "ItemA"]
let prices = [14.40, 41.63, 3.71, 15.63]
let catalog1 = Dictionary(uniqueKeysWithValues: zip(items, prices))
let catalog2 = Dictionary(prices, uniquingKeysWith: { (l, r) in
l })
let catalog3 = Dictionary(prices, uniquingKeysWith: { (l, r) in
l + r })
let merged = catalog.merge(catalog3) { (l, r) in r }

DictionarySet现在可以筛选成为原始类型的另一个对象,而不再筛选为Array。此外字典也已经可以支持新的mapValues方法:

复制代码
let catalog4 = catalog.filter { $0.value
<p> 关于字典还有一个实用的改进:在访问其元素时可以指定默认值,这样便可让下标运算符返回 Non-opt 类型: </p>
let price1 : Float = catalog['none', default: 0.0]
let price2 : Float? = catalog['none']
<p>Swift 4 中所有 <code>Collection</code> 类型均 <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0148-generic-subscripts.md"> 支持泛型下标(Generic subscript)</a>。这意味着我们可以定义下列 <code>JSON</code> 结构,不将索引的结果抛给字典:</p>
struct JSON {
init(dictionary: [String:Any]) {
...
}
subscript<t>(key: String) -> T? {
...
}
}
let json = ...
let result: String? = json['item']
</t>
<p>
对于该语言还有一个广受好评的改进:对归档和序列化的支持,以前这需要通过 <code>NSObject</code><code>NSCoding</code> 处理,无法用于 <code>struct</code><code>enum</code> 类型。但 Swift 4 通过 <code>Codable</code> 协议 <a href="https://github.com/apple/swift-evolution/blob/master/proposals/0166-swift-archival-serialization.md"> 增加了对所有类型的序列化支持 </a>。Ole Begemann 对 Swift 4 的 <a href="https://github.com/ole/whats-new-in-swift-4/blob/master/Whats-new-in-Swift-4.playground/Pages/Encoding%20and%20decoding.xcplaygroundpage/Contents.swift"> 编码和解码 </a> 提供了入门简介。例如我们可以这样定义一个 <code>Codable</code> 类型:
</p>
struct Card: Codable, Equatable {
enum Suit: String, Codable {
case clubs, spades, hearts, diamonds
}
enum Rank: Int, Codable {
case two = 2, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace
}
var suit: Suit
var rank: Rank
static func ==(lhs: Card, rhs: Card) -> Bool {
return lhs.suit == rhs.suit && lhs.rank == rhs.rank
}
}
let hand = [Card(suit: .clubs, rank: .ace), Card(suit: .hearts, rank: .queen)]
<p> 最后,Swift 4 提供了两种语言模式,可通过 <code>-swift-version</code> 编译器选项进行选择。在 Swift 3.2 模式中,编译器可接受大部分使用 Swift 3.x 编译器编译的源代码。在该模式下,大部分 Swift 4 语言功能均可用,但针对之前已有 API 的各种更新均不可用。在 Swift 4.0 模式中,我们可以使用 Swift 4 的全部功能,但可能需要改动部分源代码,这一过程通常可通过 Xcode 的迁移助理实现。
</p>
<p>Swift 4 还有很多改进,建议阅读 Swift 维护者 Ted Kremenek 的公告,并通过 Ole Begemann 在交互式 Playground 中提供的所有新功能演示来体验。 </p>
<p>Swift 4 已包含在 <a href="https://developer.apple.com/xcode/">Xcode 9</a> 中,并可手工安装到 <a href="https://swift.org/download/#snapshots">Xcode 8.3</a> 中使用。 </p>
<p><strong> 阅读英文原文 </strong><a href="https://www.infoq.com/news/2017/09/swift-4-official-release">Swift 4 is Officially Available: What's New</a></p>
2017-09-24 19:002515
用户头像

发布了 283 篇内容, 共 106.8 次阅读, 收获喜欢 62 次。

关注

评论

发布
暂无评论
发现更多内容

netty系列之:让TLS支持http2

程序那些事

Netty 网络协议 HTTP 程序那些事 http2

Python代码阅读(第41篇):矩阵转置

Felix

Python 编程 Code Programing 阅读代码

英特尔联合阿里巴巴深化从云到端全面技术合作,加速数智中国创新发展

科技新消息

LeaRun.Java可视化流程简单配置过程

雯雯写代码

java

Tensorflow Lite移动平台编译|Bazel实践

轻口味

人工智能 tensorflow ios android 10月月更

JavaAgent查看动态生成类的源码

长河

Vue进阶(幺肆贰):CSS-静态定位,相对定位,绝对定位,固定定位的用法和区别详解

No Silver Bullet

Vue 元素定位 10月月更

Spinnaker:云原生多云环境持续部署的未来

博文视点Broadview

场外OTC交易系统APP开发(案例)

技术分享| 音视频多频道使用的正确姿势

anyRTC开发者

音视频 WebRTC 实时通信 多频道

广角-聊聊Underlay

Lance

容器 云原生 Underlay

场外OTC交易软件系统开发介绍(源码)

助力建设智慧社区,EMQ 映云科技服务美好生活

EMQ映云科技

物联网 mqtt 智慧社区

存储大师班 | 浅谈数据保护之快照与备份

QingStor分布式存储

分布式存储 快照 备份

币币交易APP系统开发费用(源码)

全周期数据管控,为「快递大数据+」保驾护航

BinTools图尔兹

边缘AI方案落地问题探讨

华为云开发者联盟

机器学习 AI 算法 边侧数据 边缘云

华为云GaussDB深耕数字化下半场,持续打造数据库根技术

华为云开发者联盟

Serverless 云原生 华为云 GaussDB 云数据库

新手 Gopher 如何写出更健壮的 Go 代码

baiyutang

golang 10月月更

主干开发你必须知道的7件事

华为云开发者联盟

产品 测试 团队 开发 主干开发

滚雪球学 Python 番外篇之游戏世界,游戏也有 Hello World

梦想橡皮擦

10月月更

数字货币交易软件系统开发介绍(搭建)

一文读懂「TTS语音合成技术」

澳鹏Appen

人工智能 语音 nlp 语音合成 TTS

谈 C++17 里的 Command 模式

hedzr

设计模式 命令模式 Design Patterns c++17 Command Pattern

【Flutter 专题】24 易忽略的【小而巧】的技术点汇总 (三)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 10月月更

币币撮合交易软件系统开发(源码搭建)

java.lang.OutOfMemoryError:GC overhead limit exceeded

看山

Java OOM 10月月更

【LeetCode】最小操作次数使数组元素相等Java题解

Albert

算法 LeetCode 10月月更

带你掌握java反序列化漏洞及其检测

华为云开发者联盟

Java 安全 漏洞

直播预告 | Apache APISIX × Apache SkyWalking 线上分享

API7.ai 技术团队

Apache Skywalking API网关 APISIX Meetup

为金融场景而生的数据类型:Numeric

青云技术社区

postgresql 云计算 源码 云原生

Swift 4正式发布,新功能概览_开源_Sergio De Simone_InfoQ精选文章