Swift 2.2 有哪些变化?
lplo
9年前
<p>这次苹果公开宣布的Swift2.2是随着Swift开源之后,通过反映了在Github提交的许多bug的首次官方版本。并且苹果公司一起发布了 XCode 7.3,让我们看看有哪些变化吧。如大家所熟知的 Swift 3.0 预计会在今年年末(2016年10月份)发布,Swift 2.2 可以说是一个过渡性版本,主要是bug修复,性能提升,在不影响原先代码使用的一些小改进。本文的内容并不是Swift 2.2的所有内容,主要是总结了官方发布文档中这次更新的主要内容。请参考 <a href="/misc/goto?guid=4959670019614466256" rel="nofollow,noindex">官方公布文档</a></p> <h3>弃用 ++ 、 -- 和 C 风格的 for 循环语句</h3> <p>SE-0004 相比使用 num++ ,integer 或者 float 更为推荐使用 num += 1 ,Index 方式则使用 x = x.successor() 。使用 ++ 并不会马上就会有错误提示,但是随着日后3.0版本的发布, ++ 语法的消失,会出现代码错误修正提示。Swift 3.0 会有很多修正和改善的语法,现在就行动起来把 ++ 和 -- 去掉也未尝不可。</p> <p><img src="https://simg.open-open.com/show/ebc841d2522410d6993a8859032911c9.png"></p> <p>++ 和 -- 不再使用的原因是虽然所有的开发者非常明确的知道 a++ 和 ++a 的差异,但是非常影响代码的可读性,并且上述语法是在 C 风格的 for 循环语句中最为常用,由于 C 风格的 for 循环语句在 3.0 版本中会完全消失,所以 ++ 和 -- 的删除并不会给开发者带来太多的不便。</p> <h3>C 风格的 for 循环语句不建议再使用。</h3> <p>官方建议使用如下方式的 for 循环语句</p> <pre> <code class="language-objectivec">for i in 1...10 { print("\(i) iphone") }</code></pre> <p><code>使用数组进行遍历。</code></p> <pre> <code class="language-objectivec">var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for number in array { print("\(number) green bottles") }</code></pre> <p><code><code>C 风格的 for 循环语句在 3.0 版本中会完全消失。</code></code></p> <h3><code><code>支持更多的关键字用作为参数名</code></code></h3> <p><code><code>Argument labels(为参数添加标记)是 Swift 的一项语法。如下所示,可以在传递带标记的参数,不用考虑参数的顺序,通过参数前的标记提高了代码的可读性。</code></code></p> <pre> <code class="language-objectivec">for i in 1.stride(through: 9, by: 2) { print(i) }</code></pre> <p><code><code><code>这段代码输出的结果和下段代码所输出的结果不同。 (stride 函数的 through 和 to 不同),请参考 <a href="/misc/goto?guid=4959670019709526089" rel="nofollow,noindex">stride 文档</a> 。 </code></code></code></p> <pre> <code class="language-objectivec">for i in 1.stride(to: 9, by: 2) { print(i) }</code></pre> <p><code><code><code><code>Argument label 可以使用的名字有很多限制条件,但是在2.2版本中大部分关键字变的可用。现在只有 var、let 和 inout 不能使用,但是这个限制条件会在 3.0 版本中消失。</code></code></code></code></p> <p><code><code><code><code>更为详细的内容请参考 <a href="/misc/goto?guid=4958975005039251273" rel="nofollow,noindex">SE-0001</a> 。 </code></code></code></code></p> <h3><code><code><code><code>为 Tuple(元祖)增加对比操作符</code></code></code></code></h3> <p><code><code><code><code>在 Swift 2.2 版本以前是无法比较两个元祖的。在新版本中我们可以用如下的方式比较两个元祖。</code></code></code></code></p> <pre> <code class="language-objectivec">let singer = ("Taylor", "Swift") let korea = ("Gangnam", "Style") if singer == korea { print("Matching tuples!") } else { print("Non-matching tuples!") }</code></pre> <p><code><code><code><code><code>但是支持范围仅在 Tuple(元祖)里面的元素不多于6个的情况下。</code></code></code></code></code></p> <p><code><code><code><code><code>更为详细的内容请参考 <a href="/misc/goto?guid=4959670019815531118" rel="nofollow,noindex">SE-0015</a> 。 </code></code></code></code></code></p> <h3><code><code><code><code><code>改善 associated(关联) 类型变量声明方式</code></code></code></code></code></h3> <p><code><code><code><code><code>使用 typealias 关键字可以声明2种不同类型的变量。</code></code></code></code></code></p> <ul> <li><code><code><code><code><code>为一个已经存在的类型取个别名</code></code></code></code></code></li> <li><code><code><code><code><code>在协议中作为一个类型的占位名称</code></code></code></code></code></li> </ul> <p><code><code><code><code><code>上述2种是完全不懂的用法,不应该用一样的关键字,为了声明 associated 类型的变量应该使用 associatedtype,而不是使用 typealias。更为详细的内容请参考 <a href="/misc/goto?guid=4959670019901844278" rel="nofollow,noindex">SE-0011</a> 。 </code></code></code></code></code></p> <h3><code><code><code><code><code>增加 #if swift 语法在编译期检测 Swift 版本 </code></code></code></code></code></h3> <p><code><code><code><code><code>Swift 2.2 在 编译设置里支持如下方式的 Swift 版本检测</code></code></code></code></code></p> <pre> <code class="language-objectivec">#if swift(>=2.2) print("Running Swift 2.2 or later") #else print("Running Swift 2.1 or earlier") #endif</code></pre> <p><code><code><code><code><code><code>更为详细的内容请参照 <a href="/misc/goto?guid=4959670019982149458" rel="nofollow,noindex">SE-0020</a> </code></code></code></code></code></code></p> <h3><code><code><code><code><code><code>其他</code></code></code></code></code></code></h3> <ul> <li><code><code><code><code><code><code><a href="/misc/goto?guid=4958973377050938320" rel="nofollow,noindex">Swift Package Manager</a> 距离发布还有很长一段时间。 </code></code></code></code></code></code></li> <li><code><code><code><code><code><code>现在在 linux 上并没有太多的改善. 虽然这回发布的 Swift Core Libraries 没有包含,但是 LLDB 和 the REPL 已经包含了。</code></code></code></code></code></code></li> <li><code><code><code><code><code><code>开发者文档更新 <a href="/misc/goto?guid=4959670020104677693" rel="nofollow,noindex">点击这里</a> 查看详细内容。 </code></code></code></code></code></code></li> </ul> <p>来自: <a href="/misc/goto?guid=4959670020186018693" rel="nofollow">https://realm.io/cn/news/swift2-2/</a> </p>