11

伴随春天而来的 Swift 3.1 - SwiftCafe 享受代码的乐趣

 4 years ago
source link: http://www.swiftcafe.io/post/swift-31
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

伴随春天而来的 Swift 3.1

伴随春天而来的 Swift 3.1

swift 发布于 2020年12月18日 Sequence 协议添加两个方法 protocol Sequence {
// ...
/// Returns a subsequence by skipping elements while `predicate` returns
/// `true` and returning the remainder.
func drop(while predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.SubSequence
/// Returns a subsequence containing the initial elements until `predicate`
/// returns `false` and skipping the remainder.
func prefix(while predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self.SubSequence
}

drop 方法会遍历所有元素并接受一个 predicate 对于 predicate 返回 true 的所有元素,生成一个新的数组并返回。

prefix 方法也比较实用, 它接受一个 predicate,直到 predicate 返回 false,并忽略之后所有的元素后生成一个新的集合并返回。 正好是 prefix 的含义。

这个改动来自 SE-0045 号提案,原地址:https://github.com/apple/swift-evolution/blob/master/proposals/0045-scan-takewhile-dropwhile.md

Swift 版本编译兼容性语法支持

因为 Swift 版本变化非常快,并且标准库的接口也经常会有很大变化,所以这次 Swift 对 @available 语法添加了扩展,现在你可以指定代码的语言版本了, 比如:

@available(swift, obsoleted: 3.1)
class Foo {
//...
}

上面这段代码的意思是,只有在 Swift 3.1 以下的编译器,这个类才有效,以后的版本无效。 obsoleted 就是从这个版本中移除的意思。个人感觉这个特性还是非常有用的,尤其是经历过 Swift 版本更新后项目被搞挂的同学了。

这个改进源自提案 SE-0141: https://github.com/apple/swift-evolution/blob/master/proposals/0141-available-by-swift-version.md

这里面也说了,尽管以前也可以用 #if swift(>= N) 这样的语法来判断 Swift 版本,但这个毕竟是编译预处理命令,以为这你要针对每个 Swift 版本的编译器都构建一个版本。(可以想想编译预处理的原理,就不难理解为什么要针对每个版本都构建了。)

精确的数值转换

Swift 3.1 对数字类型的转换提供了一个精确化的实现,比如:

let num = Int(exactly: 2.2)
print(num) // 输出 nil

上面这个代码输出结果是 nil, 而不是 2。

为什么要提供 exactly 这种实现呢,我的解读是这样。因为传给 Int 构造方法的是 2.2 的浮点数, 如果把它转换成 Int 类型就会变成 2。在某些情况下有可能这不是你期望的结果,比如咱们平常都会解析从服务端发送过来的 JSON 数据。

这个接口如果发现从浮点数转换成整型数会损失精度, 就会直接返回 nil。 同样,下面这个代码就会正常转换,因为这次转换没有损失精度:

let num = Int(exactly: 2.0)
print(num) // 输出 2

这个改动来自提案 SE-0080:https://github.com/apple/swift-evolution/blob/master/proposals/0080-failable-numeric-initializers.md

结束

以上就是 Swift 3.1 的几个主要改动了,这次发布的是一个小版本,所以不会对语言有太多天翻地覆的变化。 除了对语言本身的改进,还有对包管理工具的改进。

完整的内容,可以参考官方的发布文档: https://swift.org/blog/swift-3-1-released/

如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
qrcode.jpg 关注微信公众号
发现更多精彩
swift-cafe


Recommend

  • 11

    SwiftCafe 享受代码的乐趣 桌面 Widget 设计规范swift 发布于 2020年12月16日 这次继续和大家探讨 Widget 相关话题。 苹果在大多数发布的技术组件, 都会给出一套建议的设计规范。 这次 iOS 14 发布的桌面 Wid...

  • 17

    iOS 14 制作自己的桌面 Widget iOS 14 制作自己的桌面 Widgetswift 发布于 2020年12月16日 在上一篇文章中, 我和大家介绍了 iOS 14 Widget 的基本内容, 了解了组成 Widget 的主要几个组件. 这篇文章开始, 我会...

  • 9

    iOS 14 Widget 上手体验 iOS 14 Widget 上手体验swift 发布于 2020年12月16日 今年的线上 WWDC 已经开始有一段时间了. 苹果在 iOS 14 中进行了一系列更新. 其中桌面 Widget 是最引人注意的一次革新. 在之前的...

  • 43

    SwiftCafe 享受代码的乐趣 SwiftUI 初体验swift 发布于 2020年12月18日 刚刚过去的 WWDC 2019 开场演讲,可以说是干货多多, 发布了很多有意思的东西。对我们公众号的用户群来说, 我最先想要分享的那肯定就是...

  • 24

    SwiftCafe 享受代码的乐趣 Swift 5 - 对 raw string 的支持swift 发布于 2020年12月18日 Swift 5 在今年年初正式发布了, 这个年轻的语言现在也变得越来越完善了, 最近打算和大家聊聊它最新的改变. 什么是...

  • 8

    如何用好 Android 包管理系统 如何用好 Android 包管理系统swift 发布于 2020年12月18日 这是第一次在这里和大家分享 Android 相关的内容, 其实我一直是 iOS 和 Android 都在做, 只是之前这里一...

  • 10

    SwiftCafe 享受代码的乐趣 多窗口命令行的玩法swift 发布于 2020年12月18日 我们平时在开发产品的时候都免不了要使用命令行. 比如安装 CocoaPods 组件, 或者操作 Git 版本库等等. 往往会用命令行同时操作几个...

  • 5

    Magnet: 推荐一款Mac上的好工具 Magnet: 推荐一款Mac上的好工具swift 发布于 2020年12月18日 作为一个应用开发者, 不知不觉也成了各大应用商店的常客, 经常会去看排行榜, 看看有没有好的应用值得研究入手.

  • 7

    了解 Xcode 项目文件 .xcodeproj 了解 Xcode 项目文件 .xcodeprojswift 发布于 2020年12月18日 作为一名开发者, 肯定对 Xcode 的项目文件 .xcodeproj 不陌生了. 我们用 Xcode 创建的任何一个项目...

  • 15

    Swift 4.0 中对 Dictionary 的改进 Swift 4.0 中对 Dictionary 的改进swift 发布于 2020年12月18日 Swift 4 发布已经有一段时间了, 不知道大家有没有切换到 4.0 版本。 这次 4.0 更新给我最大的感受就是没有...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK