相对于Objective-C,Swift是一种编译代码时速度更快、安全性与可靠性更高、同时具有可预测性的语言。下面我们列出了在实践中使用这种新语言时,所获取一些Swift使用技巧。这些技巧有助于让开发者编写出更干净的代码,并能帮助更熟悉Objective-C的程序员适应Swift编程,同时适用于在Swift上具有各种背景经历的人,请继续往下看。
章节的顺序是按照使用者对Swift的熟悉程度来排列的。第一部分是针对不太了解Swift的人,第二部分是针对初级入门者,而最后一部分是对于已在使用Swift的人。
你应当了解,但有可能不知道的Swift技巧 提高常数的可读性在Swift中使用struct的简洁办法,就是在应用中制作一个适用所有常数的文件。由于Swift允许我们嵌用下面的结构,这种办法非常有用:
import Foundation struct Constants { struct FoursquareApi { static let BaseUrl = "https://api.foursquare.com/v2/" } struct TwitterApi { static let BaseUrl = "https://api.twitter.com/1.1/" } struct Configuration { static let UseWorkaround = true } }嵌套让我们可以为常数生成一个命名空间(namespace)。例如:我们可以使用Constants.FoursquareApi.BaseUrl来访问Foursquare的BaseUrl常数,这样会使得数据可读性更高,并为相关的常数提供一系列封装。
为了提高性能,要避免NSObject与@objcSwift允许我们将分类进行扩展,从NSObject到获取对象的Objective-Cruntime系统功能。还允许我们用@objc来注释Swift方法,以便在Objective-C runtime中使用。
支持Objective-C runtime,代表着系统不再通过通过静态或vtable分配,而是动态分配来调用方法。结果就是:在调用支持Objective-C运行的方法时,性能损失会高达四倍。在实际应用中,这种情况对性能的影响也许微不足道,不过这样一来,我们就知道通过Swift执行方法调用要比使用Objective-C快四倍。
在Swift中使用方法调配(Method Swizzling)方法调配是替换一个已存在的方法实现。如果对此不熟悉,可以 阅读这篇文章 。Swift优化后,不再像Objective-C中那样,在runtime寻找方法的位置,而是直接调用内存地址。因此默认情况下,在Swift类中调配无法起效,除非:
用动态关键字禁用这种优化。这是最佳选择,如果数据库完全以Swift构建的话,这种选择也是最合理的方式。
扩展NSObject。如果单纯为了方法调配的话,不要用这种方式(而要采用动态的)。需要了解:在将NSObject作为基础类的已存在类中,方法调配是有效的,不过最好使用动态选择的方法。
在要调配的方法中使用@objc注释。如果我们想要调配的方法同时也需要使用Objective-C的代码,那么这种方法是最合适的。
更新:根据要求,我们增加了一个完全使用Swift的调用样例。在这个样例中仍需要Objective-C runtime,不过类并非继承自NSObject,方法也未标记成@objc。
import UIKit class AwesomeClass { dynamic func originalFunction() -> String { return "originalFunction" } dynamic func swizzledFunction() -> String { return "swizzledFunction" } } let awesomeObject = AwesomeClass() print(awesomeObject.originalFunction()) // prints: "originalFunction" let aClass = AwesomeClass.self let originalMethod = class_getInstanceMethod(aClass, "originalFunction") let swizzledMethod = class_getInstanceMethod(aClass, "swizzledFunction") method_exchangeImplementations(originalMethod, swizzledMethod) print(awesomeObject.originalFunction()) // prints: "swizzledFunction" 入门者所需的Swift技巧 清理异步代码Swift在编写补齐函数(completion function)上语法非常简洁。在Objective-C中有completion block,不过出现的很晚, 语法也有些粗糙 ,如下:
[self loginViaHttpWithRequest:request completionBlockWithSuccess:^(LoginOperation *operation, id responseObject) { [self showMainScreen]; } failure:^(LoginOperation *operation, NSError *error) { [self showFailedLogin]; }];