在用Objective-C编写的不同类型中,我们仍可以用数字对象来进行转换,不过在Swift中,转化值的 常用方式 是使用目标类型的构造函数。举个例子,如果我们从API中获得一个数字userID,将其在数字对象中打开并显示为字符串,在Objective-C中需要输入[userId stringValue]。而在Swift中数字对象不再使用(除非要向后兼容Objective-C),因为在Swift中,数字结构与在Objective-C中限制不同。
注意:在使用Objective-C或依赖没有Swift封装的旧式代码库中,可能仍得使用数字对象。在这种情况下,数字对象API基本没什么变化。
相反,在Swift中我们通过构造函数进行等效转换。举个例子,如果userID是一个Int,而我们想要字符串的话,只需通过String(userId)进行转换。这比一直将数字对象装箱拆箱容易多了,不过数字对象所提供的各种各样的转换,确实让API简单易用。
通过默认参数减少样板文件代码在Swift中,函数自变量现在可以有默认值了。这些默认的参数减少了杂乱程度。如果某函数的被调用者选择使用默认值,由于默认参数可以省略,这个函数调用就能更短一些了。例如:
unc printAlertWithMessage(message: String, title: String = "title") { print("Alert: \(title) | \(message)") } printAlertWithMessage("message") // prints: Alert: title | message printAlertWithMessage("message", title: "non-default title") // prints: Alert: non-default title | messagex 为更熟练的使用者提供的一些Swift技巧 通过Guard来验证方法Swift的guard语句让代码更简洁、更安全。guard语句会检查一到多个情况,找出不符合else部分的调用。而else部分需要return,break,continue或throw语句来终止方法的执行,也就是说终止程序控制的执行。
我们使用guard语句来减少代码混乱,并避免在if/else语句中的嵌入。由于在guard语句的else部分中,代码必须转移程序控制的范围,如果出现无效的情况,简单地采用if语句来调用return语句更为安全。在编译时这些bug仍有可能出现。如果guard语句的情况通过的话,在我们的范围中,解包后的可选值仍旧可用。
class ProjectManager { func increaseProductivityOfDeveloper(developer: Developer) { guard let developerName = developer.name else { print("Papers, please!") return } let slackMessage = SlackMessage(message: "\(developerName) is a great iOS Developer!") slackMessage.send() } } 用Defer管理程序控制流defer语句会推迟包含这个命令的代码执行,直到当前范围终止。也就是说,在defer语句中清理逻辑是可以替换的,而且只要离开相应的调用范围,这段命令就肯定就会被调用。这样可以减少冗余步骤,更重要的是增加安全性。
func deferExample() { defer { print("Leaving scope, time to cleanup!") } print("Performing some operation...") } // Prints: // Performing some operation... // Leaving scope, time to cleanup! 简化单例模式(Singleton)在任何语言中对 单例模式 的使用都属于 热议话题 ,不过它仍是大多数开发人员非常熟悉的 模式 。在Objective-C中,实现单例模式包括多个步骤,以便确保不会多次创建单例模式类。在Swift中这种使用有了大幅简化。下面我们会看到在Objective-C中实现单例模式的代码行数,是在Swift中实现单例模式代码的两倍。除此之外,由于使用了dispatch token,不仅可读性较差,也很难记住。
Objective-C:
@implementation MySingletonClass +(id)sharedInstance { static MySingletonClass *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }