在这个让人略失误的let us loop you in 发布会之后,苹果开放了包含Swift 2.2 版本的Xcode7.3版本的下载。这是Swift开源之后的第一次发布官方版本,这也是第一个包含非Apple官方程序员贡献者的版本,根据Release notes的统计,该版本共包含了212位非Apple官方程序员的贡献,包括但不限于以下几个:
- SE-0001: Allow (most) keywords as argument labels
- SE-0015: Tuple comparison operators
- SE-0014: Constraining AnySequence.init
- SE-0011: Replace typealias keyword with associatedtype for associated type declarations
- SE-0021: Naming Functions with Argument Labels
- SE-0022: Referencing the Objective-C selector of a method
- SE-0020: Swift Language Version Build Configuration
虽然在之前的snapshot版本中,swift2.2包含了swift自己的包管理工具Swift Product Manager(以下称SPM),但是包含在Xcode7.3中的swift2.2并未包含SPM工具,想使用最新的swift toolchain管理包的同学只能去下载swift3.0的snapshot了
有关Swift2.2版本方面的代码方面的改变:
- 移除C语言风格的for循环,同时移除++和–操作符,包括前置与后置,将在3.0版本中彻底停用
- 函数方法将不能直接声明为柯里化参数列表, 而是需要返回一个相同参数的函数方法.
这里用代码举例解释一下:
func doGET(url: String, completionHandler: ([String]?, NSError?) -> ()) { // do a GET HTTP request and call the completion handler when receiving the response } func completionHandler(results: [String]?, error: NSError?) { self.results = results self.resultLabel.text = "Got all items" self.tableView.reloadData() } func getAll() { doGET("http://blog.swiftflamel.com", completionHandler) }
这样的写法在swift2.1及以前都是被认同的,但是在2.2版本中,这种写法将无法被编辑器识别,将直接报错,而之后只能使用如下这种写法:
func completionHandler(text: String) -> ([String]?, NSError?) -> () { return {results, error in self.results = results self.resultLabel.text = text self.tableView.reloadData() } } func getAll() { doGET("http://blog.swiftflamel.com", completionHandler("Got all items")) }
而在swift2.1版本及以前,以上的写法还可以用写法上更简单的柯里化函数来写:
func completionHandler(text: String)(results: [String]?, error: NSError?) { self.results = results self.resultLabel.text = text self.tableView.reloadData() }
而如今柯里化函数也不被允许了,会被编辑器要求替换为第二种方法的写法
- 将函数选择器(selectors)的用法由原来的Selector(“doSomething”)或者大多数像我一样的直接”doSomething”改为#selector(doSomething),并且现在会在编译时检查这一写法
- 大部分关键词现在都可以被用来作为函数的参数名
- 现在在协议(protocol)中可以声明联合类型(Associated types)了,任何遵守协议的类或结构体可以定义具体的类型
关于Associatedtypes的解释:意思就是现在你可以通过“associatedtype”关键词在协议中声明一个(或多个)变量,这个变量的具体类型将在继承了该协议的类或结构体中来定义,来看一下官方的例子:
protocol Container { associatedtype ItemType mutating func append(item: ItemType) var count: Int { get } subscript(i: Int) -> ItemType { get } } //使用的时候就这样: struct IntStack: Container { // original IntStack implementation var items = [Int]() mutating func push(item: Int) { items.append(item) } mutating func pop() -> Int { return items.removeLast() } // conformance to the Container protocol typealias ItemType = Int mutating func append(item: Int) { self.push(item) } var count: Int { return items.count } subscript(i: Int) -> Int { return items[i] } }
这样应该就能大概明白associated type的用法了吧,更多详细深层的用法可以去查看官方文档:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Generics.html
有关Xcode:
Editor里只有这一条,但我相信这会让绝大多数iOS开发者非常兴奋了,对于升级为对Release notes不感兴趣的开发者,相信它们打了几个代码下去之后就会发现这令人惊喜的改变,不错,现在的Xcode自带的代码补全也加入了模糊匹配功能,而且表现很优秀,Fuzzy Autocomplete是一个非常优秀的代码补全插件,但是我在用了一段时间之后不得已从我的Xcode卸载了它,因为当应用的文件规模变大时它的性能需求也变得非常高,我最新的15”rMbp也会被弄得异常卡顿,甚至让我有了使用Windows系统的感觉。但最新版Xcode的这个自动补全功能使用起来非常顺畅,在大项目中依然不会卡顿,立刻去升级Xcode7.3吧,享受一下。
版权所有,转载请先联系flamelswift@gmail.com