Swift 3.1 的一些新特性

 

推荐序

本文来自泊学的投稿,介绍了 Swift 3.1 的新特性,感谢泊学授权发表。以下为文章正文。

正文

Apple 终于发布了Xcode 8.3以及Swift 3.1。如果你没时间仔细通读一遍release note,至少,Swift 3.1中的一些新特性还是值得了解的,为此,我们特别制作了一个免费的内容系列。当然,Swift 3.1和Swift 3在源代码级别是兼容的,因此,如果你的项目已经更新到了Swift 3,这次更新应该不会给你带来太多麻烦。但是,Xcode 8.3去掉了对Swift 2.3的支持,所以,如果你还停留在更早版本的Swift上,就还是谨慎更新的为好。

接下来,我们就简单介绍下这个系列里的内容。

SE-0080 数值类型的failable initialize

这是SE-0080带来的改进。例如,之前,当我们把一个Double强制转换成Int的时候,Swift会自动取消小数点后的部分。当我们需要在不同的数字类型之间执行“无损”的精度转换时,这个功能就非常有用,当转型会导致精度丢失的时候,init(exactly:)方法会给我们返回nil。我们通过一个最常见的场景:解析服务器返回的JSON,向大家展示了这个功能的具体用法。

SE-0045 Sequence中新添加的两个筛选元素的方法

prefix(while:)drop(while:)是Swift 3.1中新加入到Sequence类型的两个API方法,通过它们,可以帮助我们更有效的编写在Sequence中筛选元素的方法。特别是,如果我们要在一个无限序列中筛选元素,它们就显得更方便了。

SE-0103 临时转换成escaping的closure

就像SE-0103中描述的一样,在Swift 3里,函数的closure类型参数默认从escaping变成了non-escaping。这很好理解,因为大多数用于函数式编程的closure参数的确都以non-escaping的方式工作。

但这份提议也提到了一个问题,就是有时候,我们需要把non-escaping属性的closure,传递给需要escaping属性closure的函数。什么时候需要这种场景呢?也许你在其他地方看到的解释是:这是一个不太常见的用法。

SE-0141 通过available约束Swift版本

虽 然之前我们可以通过#if这样的形式达到版本控制的目的,但如果我们用这样的方式编写程序库,就会有一个不太方便的地方。编译器要为它支持的每一个 Swift版本都独立编译一遍。于是,如果在一个Swift ABI累积性更新之间兼容了多个Swift版本,那么携带这段时间编写的程序库就是一个比较笨重的事情。一个更好的办法,当然应该是只编译一次,然后在生 成的程序库包含每个API可以支持的Swift版本。

为此Swift 3.1中,对@available进行了扩展,我们不仅可以用它来约束操作系统,还可以指定Swift的版本。

SR-1009 使用具象类型约束泛型参数

在Swift 3.0中,如果我们要为某个特定类型的Optional添加extension,不是一件太容易的事情。我们得通过用protocol约束一个类型相同的computed property来模拟某个具象类型的约束。但在Swift 3.1里,这个缺陷被弥补了,我们不仅可以对泛型参数使用protocol进行约束,还可以使用具象类型作为类型约束,这有点儿像C++泛型中的模板偏特化技术。

SR-1446 关于内嵌类型的两种改进

这一部分,我们来聊聊和内嵌类型有关的话题。在Swift 3.1里,内嵌类型有了两方面的改进:

  • 普通类型的内嵌类型可以直接使用其外围类型的泛型参数,此时它仍旧是一个普通类型;

  • 泛型类型的内嵌类型可以拥有和其外围类型完全不同的泛型参数;

点击“阅读原文”,可以查看泊学中相应的免费视频教程。如果你想订阅泊学的服务,使用这个链接可以多获得 30% 会员时长: http://t.cn/R6GtgJS 。

Swift 3.1 的一些新特性的更多相关文章

  1. Swift 3到5.1新特性整理

    本文转载自:https://hicc.me/whats-new-in-swift-3-to-5-1/,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有. Hipo 2.0 重写从 Swif ...

  2. iOS开发——新特性OC篇&Swift 2.0新特性

    Swift 2.0新特性     转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...

  3. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

  4. Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结

    Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结 1. defer关键字1 2. try!形式存在的“不失败”机制3 3. Guard 4 4. swift的新语 ...

  5. Swift 3 新特性和迁移详解

    写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 S ...

  6. Swift 3 新特性

    原文:What's New in Swift 3? ,作者:Ben Morrow,译者:kmyhy Swift 3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变.如果你没有关注过 S ...

  7. iOS - Swift Swift 语言新特性

    1.Swift 2.0 带来哪些新变化 常规变化: 1.OS X 10.11.iOS 9 和 watchOS 2 SDK 采纳了一些 Objective-C 的特性用来提高 Swift 的编程体验, ...

  8. iOS开发——新特性篇&swift新特性(__nullable和__nonnull)

    swift新特性(__nullable和__nonnull) 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是为了swift与OC混编的时候产生 ...

  9. iOS开发——新特性Swift篇&Swift 2.0 异常处理

    Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...

随机推荐

  1. SASS详解之编译输出的样式

    SASS是一种CSS预处理语言,没有装环境的话是不能被解析的.但是有了koala编译工具之后,解析SASS不需要环境也毫无压力了.SASS的输出格式有四种:嵌套.扩大.紧凑和压缩.下面结合小例子为大家 ...

  2. 自定义控件 淘宝头条【ViewFlipper】

    简易版 代码 ); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Acti ...

  3. C++标准库 bitset

    本文地址:http://www.cnblogs.com/archimedes/p/cpp-bitset.html,转载请注明源地址. 有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值 ...

  4. [C++基础]那些容易被混淆的概念:函数/数组指针-指针函数/数组,类/函数模板-模板类/函数

    函数指针-指针函数 函数指针的重点是指针.表示的是一个指针,它指向的是一个函数.eg: int (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.eg: int* fun() ...

  5. 获取jQuery版本号

    今天在一个页面需要知道jquery版本号,来决定使用什么样的方法,有以下方式可以获取到 $.fn.jquery $.prototype.jquery 这两种方式都可以获取到jquery的版本号

  6. 再谈Cognos利用FM模型来做同比环比

    很早之前已经讲过 <Cognos利用DMR模型开发同比环比>这篇文章里说的是不利用过滤器,而是采用 except (lastPeriods (-9000,[订单数据分析].[日期维度].[ ...

  7. 截短字符串的函数(JS中适用)

    function cutShort(str){    if(str.length>15){        str=str.substr(0,15)+"...";    }   ...

  8. angularjs中的ng-src和ng-href

    ng-src和ng-href等同于html中的src和href,只是ng是在dom加载完毕之后才能够发挥作用,如果在src或href中绑定变量,如果ng没有加载完,会导致链接地址出错,如果用对应的ng ...

  9. UNIX网络编程读书笔记:UNIX域协议

    概述 UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同.UNIX域协议可视为进程间通信 ...

  10. SQL Server Management Studio 简单使用说明

    1.对数据库中的数据生成脚本 a.选中要生成脚本的数据库右键->任务->生成脚本(如下图)->下一步->下一步->选中你想要生成的内容->下一步->完成