原文作者:Erica Sadun
原文链接:http://ericasadun.com
时间:2016年7月15日
译者:与狼同行
Swift3已经是一个十分引入瞩目的产品,它汇聚了许多来自Swift开源社区的人们所给予的灵感,想法还有辛勤的劳动。
可是现在,我想谈一谈Swift3发布的终局:
这里我来举几个关键的点:
- Swift3最后采取根本变化的日子是7月27日。
那一天,很有可能会出现对于Swift3的修改批准但是没有实现的建议。其中包含一些重大的改变。于是,我们会有一次开放的讨论,来商议那些议案的在Swift3和未来版本的Swift中的命运。 - 8月1日我们将开始展开Swift4的讨论。这部分的讨论将可能会引向一个很重要的事情,那就是在Swift3中所推迟,而作为Swift4的一个大目标 -- ABI稳定。直到那之前,讨论应该仍然会集中关于Swift3.
- 值得注意的是,在最后决定Swift3采取重大更新和开始讨论Swift4之间我们会刻意的留出几天。这个想法是提供几天的时间来让社区总结一下我们在Swift3中哪些事情已经结束了。
- 关于Swift3开发的最后分支计划已被决定,但是很有可能会被主线所影响。其中的一部分会在6月27日讨论如何去处理哪些在Swift3中剩余的还没被实现的议案。
- Swift3最后的发布日期仍然待定。但是会在7月27日后,Swift3将会基本结束,而不会再积极更新。
- 随着最近几周的思考,我要呼吁几个同意但没有实现的议案,来引起注意。这些议案在目前苹果的Swift团队未来几周的时间中还无人解决。
SE-0042: 拍扁那些未应用状态的函数实例
译者注:一个未应用状态的函数实例(unapplied method )是指诸如下面例子中的Type.instanceMethod,
产生一种诸如(Self) -> (Args...) -> Ret:的函数类型
struct Type {
var x: Int
func instanceMethod(y y: Int) -> Int {
return x + y
}
}
let f = Type.instanceMethod // f : (Type) -> (y: Int) -> Int
f(Type(x: 1))(y: 2)
为了将未应用状态的函数实例更有用和持久来符合Swift语义,并且对于mutating方法更有效率,
我们应该将其变为一种更平坦的函数类型(Self, Args...) -> Ret:
let f = Type.instanceMethod // f: (Type, y: Int) -> Int
f(Type(x: 1), y: 2) // ==> 3
SE-0068:对于值类型和类一级成员,将dynamicType更名为Self
SE-0075: 添加一个生成配置导入测试
译者介绍:形如此类:
#if canImport(UIKit)
// UIKit-based code
#elseif canImport(Cocoa)
// OSX code
#elseif
// Workaround/text, whatever
#endif
#if !os(Linux)
// Matches OSX, iOS, watchOS, tvOS, Windows, FreeBSD
#endif
SE-0096: 将dynamicType从一个属性转变为操作符
译者介绍:
在swift中,dynamicType是一个属性。也因为这样,对于任何值不管他有没有用,你都可以写
这样的代码:比如说: 4.dynamicType和myFunction().dynamicType。
与大多数属性不同的是,它并不表示特定类型的逻辑特性。
由于dynamicType表现的更像一个操作符就像sizeof。希望能修改语法。
SE-0077: 改进操作符声明
译者介绍:希望用操作符的排序来取代数字优先级
// 之前的语法
infix operator <> { precedence 100 associativity left }
// 改进后的语法
precedencegroup ComparativePrecedence {
associativity: left
strongerThan: LogicalAndPrecedence
}
infix operator <> : ComparativePrecedence
SE-0092: 在协议和协议扩展中的Typealiases
SE-0110: 区分单元组函数类型和多参数函数类型
译者介绍:如今,我们我们可以这样写代码:
let fn1 : (Int, Int) -> Void = { x in
// The type of x is the tuple (Int, Int).
// ...
}
let fn2 : (Int, Int) -> Void = { x, y in
// The type of x is Int, the type of y is Int.
// ...
}
一个存在n个参数的函数变量可以被放入n个参数,也可以放入一个含n个参数的元组。
这违背了"最小诧异原则"(least surprise)和弱化了类型安全,应该被修改。
议案者提议:(1)fn2表达式应该可行,fn1应该不可行
(2)一个含n个参数的元组的函数类型应该套双层括号:
let a : ((Int, Int, Int)) -> Int = { x in return x.0 + x.1 + x.2 }
一些建议比如说SE-0075这个议案,这件事我们可以在任何时间去添加,但是许多其他的议案都目标于提升Swift3的稳定性。我想让这个社区的人知道这些议案当前没有被实现,希望能够有兴趣帮助这些议案发生在Swift3中。
相关的是,我也特别感谢社区实现:
SE-0095: 用P1 & P2 语法代替 protocol
语法 。
除了这些语言的议案,还有一系列关于标准库优秀的工作,在Swift3中将会变得更出色,以下是一个要点来总结这些任务。
https://gist.github.com/gribozavr/37e811f12b27c6
最后感谢每一个人,嗯,我是指那些为Swift3付出贡献的每一个人~