Swift: 把 Struct 做为数据模型的注意事项

做者:Andyy Hope,原文连接,原文日期:2016-03-18
译者:BigbigChai;校对:shanks;定稿:CMBgit

并非世外桃源,但也很不错!github

很高兴见到 Objective-C 的老司机对于 Swift 的新鲜语法结构和新思惟方式感到如此兴奋。做为开发者,咱们应该永远努力拓展咱们的技能,并在新的范式出现的时候乐于改变咱们的心态。编程

一个相似的例子就是处理数据结构的时候,拥抱不可变性,尽可能使用常量,这是一个很好的建议并且彻底应该被采用。另外一个例子是把咱们的数据模型转换为 Struct(结构体)。这是听起来很美好,但在实际运用中,完全地使用 Struct 来代替 Class(类),仍是给开发者带来不少困难。swift

不要误会个人意思,用 Struct 做为数据模型确实带来了很是大的好处。 只是这并非完美的办法。在这篇文章中,我会详细说明一下当你把数据模型从 Class 转换成 Struct 时会遇到的麻烦。安全

Objective-C

当你的项目的代码是 Swift 和 Objective-C 混合开发时,你会发如今 Objective-C 的代码里没法调用 Swift 的 Struct。由于要在 Objective-C 里调用 Swift 代码的话,对象须要继承于 NSObject。数据结构

Struct 不是 Objective-C 的好朋友。测试

继承

继承是面向对象编程的四大支柱之一,这深深地植入了咱们的思惟方式。当咱们可使用继承时,为何还要重复地写某一段代码?我很喜欢把个人数据模型设为可继承的,这让我不用给共享一个抽象的类重复 JSON 解析代码,这能让个人模型保持统一。ui

Struct 不能相互继承。线程

NSUserDefaults

我敢打包票你们都会在某些时候对把数据存在 NSUserDefaults 里面感到有罪恶感。这种想法很正常,由于不是每一个人都喜欢跟 CoreData 打交道,特别是仅仅要存不多的对象的时候。 技术上这是可行的,可是要用 Struct 实现的话,这还有几个小坑要踩。所以你可能最好仍是用 Class 来实现。翻译

Struct 不能被序列化成 NSData 对象。

struct 的优势

我不但愿大家认为我不喜欢使用 Struct 是由于结构体伤了个人感情。使用 Struct 来代替 Class 做为数据模型有不少好处。值类型(value type)是很是有优点的:

  • 安全性

    由于 Struct 是用值类型传递的,它们没有引用计数。
  • 内存

    因为他们没有引用数,他们不会由于循环引用致使内存泄漏。
  • 速度

    值类型一般来讲是以栈的形式分配的,而不是用堆。所以他们比 Class 要快不少,真的*不少*!在 [StackOverflow](http://stackoverflow.com/a/24243626/596821) 给 struct 和 class 进行相同操做的表现作了基准测试,Struct 比 Class 要快九百倍。(注:在 2016-05-07 的测试中,Struct 的速度为 Class 的三千七百万倍,详见 [StackOverflow](http://stackoverflow.com/a/24243626/596821))
  • 拷贝

    你有在 Objective-C 里试图过拷贝一个对象吗?你必须选用正确的拷贝类型(深拷贝、浅拷贝),这是很是烦人的,由于每次尝试你都不记得本身上次是怎么写的。 值类型的拷贝则很是轻松!
  • 线程安全

    值类型是自动线程安全的。不管你从哪一个线程去访问你的 Struct ,都很是简单。

结论

大概就是那么多,我已经点出了 Struct 的不足,同时也列出了一些 Struct 的优势去帮助你判断是否使用 Struct 类型做为数据模型。

然而,大家彻底能够搭配使用二者。在我本身的项目里,若是模型较小,而且无需继承、无需储存到 NSUserDefault 或者无需 Objective-C 使用时,我会使用 Struct。

本文由 SwiftGG 翻译组翻译,已经得到做者翻译受权,最新文章请访问 http://swift.gg

相关文章
相关标签/搜索