在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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:003067
用户头像

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

关注

评论

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

C++:使自定义类支持迭代器

不在线第一只蜗牛

c++

前端 Vuer,为自己的项目搭建一个 Playwright 测试环境吧,给自己多一点安全感!

OpenTiny社区

Vue 前端 OpenTiny

百度智能云向量数据库创新和应用实践分享

百度Geek说

数据库 百度云 数据 大模型 知识库

技术前沿:“环抱”晶体管与“三明治”布线

E科讯

移动医疗|基于音视频SDK和即时通讯IM技术实现线上问诊技术

ZEGO即构

直播技术 音视频sdk 互联网医疗 在线问诊 直播SDK

如何用 Scrapy 爬取网站数据并在 Easysearch 中进行存储检索分析

极限实验室

爬虫 Scrapy easysearch

Kotlin函数竟然如此简洁

Silently9527

Java kotlin

百度梁志祥:樱桃好吃树好栽 智能体让营销更简单

极客天地

Redis集群slot迁移改造实践

vivo互联网技术

redis集群 slot迁移 水平扩缩容

Apache Doris Flink Connector 24.0.0 版本正式发布

SelectDB

实时数仓 Doris 数据导入 Flink CDC 数据同步工具 CDC

黑神话云端开放!ToDesk 云电脑、青椒云、网易云,不用高配电脑也能畅玩!

阿Q说代码

青椒云云桌面 ToDesk云电脑 黑神话悟空 网易云游戏电脑

一个故事理解限流熔断降级

老张

系统架构 服务治理 基础架构 流量治理

SelectDB 多计算集群核心设计要点揭秘与场景应用

SelectDB

数据库 数据仓库 云原生 存算分离架构 云数据仓库

阿里云AMD护航,天谋科技携IoTDB登顶TPCx-IoT国际权威榜单

Apache IoTDB

数据资产入表全流程解析,助力企业数据要素价值释放

袋鼠云数栈

为什么说Scrum是有效的?(Why does Scrum work)

ShineScrum

使用CLion进行ROS开发

芯动大师

CLion 2023

落地数仓数据模型自动、可持续长效治理之策

Aloudata

数据仓库 数据治理 数据模型 数据血缘 主动元数据

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