Swift初体验

作为一名iOS开发者, 很久之前就断断续续学习了Swift, 但从没在公司中用Swfit完成一款完整的项目. 现在终于有整块的时间整理一下自己对Swift的理解. 也当做是一种复习吧.

第一眼看到Swift的代码就觉得, 哇! 好cool! 

我最喜欢的Swift的功能是Optionals. Optionals让我们可以应对可有可无的值, 相比在Objective-C中做的操作要简便的多. 在OC中我们必须在文档中声明nil值是否被允许,而在Swift中我们直接交给类型系统就可以了.(如果我们有一个可选值, 那么它有可能是nil;如果我们有一个值不是可选值,那么它一定不是nil)

这里我们举个例子, 在OC中

- (NSAttributedString *)attributedString:(NSString *)input

{

return [[NSAttributedString alloc] initWithString:input];

}

看上去并没有问题, 但这时input传入的参数若为nil, 就会崩溃. 这种问题只有在运行时才会发生. 取决于你怎样去用它. 如果项目上线了才发现, 就会导致用户应用程序崩溃.

我们在看一下同样作用的Swift的代码

extension NSAttributedString {

init(string str: String)

}

这里Swift中是不允许nil被传入的, 所以这个API就要变成这样.

extension NSAttributedString {

init(string str: String?)

}

注意新加上的问号。这意味着你可以使用一个值或者是 nil。类非常的精确:只需要看一眼我们就知道什么值是允许的。使用 optionals 一段时间之后你会发现你只需要阅读类型而不用再去看文档了。如果犯了一个错误,你会得到一个编译时警告而不是一个运行时错误。

类型安全

我认为类型的安全性是 Swift 一个很大的优势。就像我们在讨论 optionals 时看见的一样,我们可以用一些聪明的手段将某些检测从运行时转移到编译时。Swift 中数组的工作方式就是一个例子:一个数组是泛型的,它只能容纳一个类型的对象。将一个整数附加在一个字符组数组后面是做不到的。这样以来就消灭了一个类的潜在 bug。(值得注意的是如果你需要同时将字符串或者整数放到一个数组里的话,你可以使用 Either 类型。)

假设我们遇到一个 pounds 函数:

func pounds(input: Double) -> Double

光看类型定义很难看出来这个函数的功能。它将欧元装换成英镑?还是将千克转换成磅? (英文中英镑和磅均为 pound) 我们可以用不同的名字,或者可以建立文档 (都是很好的办法),但是我们有第三种选择。我们可以将这个类型变得更明确:

struct Mass {

let kilograms: Double

}

func pounds(input: Mass) -> Double


我们不仅让这个函数的用户能够立刻理解这个函数的功能,我们也防止了不小心传入其他单位的参数。如果你试图将其他类型参数作为参数来使用这个函数,编译器是不会接受的。另外一个可能的提升是使用一个更精确的返回值。现在它只是一个 Double。

Swift 带来了很多有趣的可能性。我尤其喜欢的一点是过去我们需要手动检测或者阅读文档的事情现在编译器可以帮我们来完成。我们可以选择在合适的时机去使用这些可能性。我们依然会用我们现有的,成熟的办法去写代码,但是我们可以在合适的时候在我们代码的某些地方应用新的可能性。

你可能感兴趣的:(Swift初体验)