Swift 特性 3 - 结构体

SwiftiBcker • 于 2015-10-08 11:21:54 +0800 • 1123 阅读

0x00

为什么写结构体呢?当然,结构体不算Swift特性,满大街的语言都有结构体这东西,但是对于OC转过来的小伙伴们来说,Swift里对结构体的运用是空前的,简单点来说就是-吓死宝宝了。我们来看下Swift是如何玩结构体的

0x01

NSString是iOS开发里最常见的一个类,也就是iOS里的字符串类,他继承于NSObject并有个兄弟NSMutableString,他俩都是类。不过到了Swift里,对应的是String,他并不是类,而被改成了结构体,起定义为: public struct String { /// An empty `String`. public init() } 好吧,我表示当我第一次看到这里时我简直快醉了,真不愧是An empty String.

0x02

第二个比较常见的NSArray到了Swift里也被改成了结构体Array,并实现了CollectionType和Indexable协议,并且相比NSArray不同的是,Array不仅支持下标读取,还支持读取一个区间,从定义来看也确实能看到其实现一个subRange的方法

public struct Array<Element> : CollectionType, Indexable, SequenceType, MutableCollectionType, MutableIndexable, _DestructorSafeContainer { /// Always zero, which is the index of the first element when non-empty. public var startIndex: Int { get } /// A "past-the-end" element index; the successor of the last valid /// subscript argument. public var endIndex: Int { get } public subscript (index: Int) -> Element public subscript (subRange: Range<Int>) -> ArraySlice<Element> }

0x03

接下来你可能已经猜到了,NSDictionary的Swift版Dictionary也被定义成了结构体,同时还有NSSet的Swift兄弟Set也同样是结构体,简~直~颠~覆~世~界~观~有~木~有~

0x04

看到这里我好像已经开始有点凌乱了,不知道大家有没有同感:字符串被改为结构体,好像还能接受,数组和字典被定义成结构体会不会有点过份了?我想表达的事,结构体为值,而不像对象的应用,在方法间传递时传应用当然会比传值快很多很多,因为传值要拷贝一份。这样一来,程序里成百上千的方法调用会不会慢成🐶?不过这种问题我这种菜鸟就不纠结了,交给编译器去考虑

0x05

Swift给我们展示了结构体能在Swift里如此大展拳脚,那我们问题来了,自己写代码是如何类和结构体呢?其实这个问题可以简化为 值 VS 引用

0x06

值类型效果(以下是伪代码):

``` var source = [1, 2, 3] var destination = source // Copy

source[0] = 10

source // [10, 2, 3] destination // [1, 2, 3] ```

引用型效果(以下是伪代码):

``` var source = [1, 2, 3] var destination = source // reference

source[0] = 10

source // [10, 2, 3] destination // [10, 2, 3] ```

那么,可以看出,应用类型的好处是可以共享一份数据,一处修改所有引用地方都跟着变化,但也带来了不可预知的风险,例如数据被慕改和线程安全问题。值类型能解决以上问题,但有有性能和数据同步麻烦等新问题。所以如何做出选择还得从四级业务出发,看需求灵活选择。

Swift选择把集合用值类型实现是一个很有趣的现象,因为大多数语言对这个问题说都选择了引用类型来设计集合。这在 OC、Java、Python、JavaScript 以及任何我能想到的语言中都是这样。Swift 却另辟蹊径,那也就意味着Array,Dictionary和String都是结构体而不是类。当他们被赋值以及作为参数被传递的时候会被拷贝。如果拷贝的代价很小的话这绝对是明智的决定,而这也正是 Swift 很努力要做到的。想必也是Swift决心要做一门类型安全语言的表现吧?

回复: 0
暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,见 Emoji cheat sheet
  • @name 会链接到用户页面,并会通知他
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
Ctrl+Enter