BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

使用值类型构建更好的Swift应用程序

| 作者 Sergio De Simone 关注 12 他的粉丝 ,译者 陆志伟 关注 1 他的粉丝 发布于 2015年8月7日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

在WWDC2015上,苹果工程师Doug Gregor和Bill Dudney评价了Swift对值类型的支持,并解释了如何通过它实现一种灵活的不可变性,以构建更好的应用。

Gregor首先评价了Objective-C中常用的引用语义。引用语义的主要问题在于它有可能产生预期之外的对象共享行为,这种行为有可能导致对象的属性被暗中改动。Objective-C程序员对此已经十分了解了,因为许多Cocoa和Cocoa Touch类,像NSString、NSURLRequest,以及所有的集合调用时都需要拷贝。所以为了让程序员更易于进行防御性的拷贝,Objective-C语言甚至为属性提供了一个copy特性,当给一个给定的属性分配对象时,运行时本身就会拷贝一个副本。

对于性能和内存的使用来说,防御性拷贝明显不是最优的措施,尤其在使用不当时更可能造成微妙的问题。

随后,Gregor继续探索不可变性是否是这个问题的正确答案。许多Cocoa类,像NSDate、NSURL、UIImage、NSNumber和其它许多类都强制实施不可变性。根据Gregor的评价,不可变性拥有许多优点,比如没有副作用和可共享,但它也会生成尴尬的接口,并且不能有效地映射到机器模型。为了具体说明这一点,Gregor在Haskell和Swift中分别运行Eratosthenes筛法来举例说明不可变性是如何牺牲性能的。

根据Gregor的评价,对值语义的使用正是这类问题的解决办法,而Swift完全支持这种值语义:

  • 所有的基本类型,比如Int、Double、String等都是值类型;
  • Swift中的所有集合类型,比如Array、Set和Dictionary都是值类型;
  • 值类型可以进行组合,比如tuples、structs和enums仅包含值类型,因而它们自身也是值类型,从而可以根据值语义建立抽象类型。

值类型仅仅就是值,并且它们是不可变的。它们没有标识符,所以只能以值来区分。这就需要所有的值类型都遵守Equatable协议。

protocol Equatable {
    /// Reflexive - `x == x` is `true`
    /// Symmetric - `x == y` then `y == x`
    /// Transitive - `x == y` and `y == z` then `x == z`
   func ==(lhs:Self, rhs:Self) -> Bool
}

此外,值类型允许应用程序根据需要在可变性和不可变性之间取得适当的平衡。Gregor表示:实际上,你可以对值类型使用let关键字,以指定一个不会改变的变量,或者使用var来指定一个可以在不影响其它值的前提下更新自身的值的变量。

let numbers = [1, 2, 3, 4]
var strings = [String]()
for x in numbers {
    strings.append(String(x))
}

如前文所述,值类型是不可变的,所以它们只能被拷贝。但是,Gregor说,它们的拷贝操作开销很低,对于简单的值类型,比如Int、Double、CGPoint等,它们的拷贝时间是个常数。对于可扩展的数据结构,将会使用写时拷贝(copy-on-write)技术,只有当值改变时,才会建立一个副本,所以这种技术比默认拷贝方式更有效率。

此次演讲的第二部分专注于提供一个使用Swift值类型进行编程的动手实验示例。

查看英文原文:Building Better Swift Apps Using Value Types

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

不可变成了趋势 by n yuxiao

各种语言都在搞不可变 immutable js……

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT