Swift 3.0之类和结构体 Swift 3.0 Classes and Structures

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看369 回复回复3 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 369|回复: 3
收起左侧

Swift 3.0之类和结构体 Swift 3.0 Classes and Structures

[复制链接]
rightnow 发表于 2016-11-4 15:30:43 | 显示全部楼层 |阅读模式
快来登录
获取优质的苹果资讯内容
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
订阅梳理好了的知识点专辑

1、写在前面

最近在学Swift 3.0,主要看的是苹果的官方文档,这里只是根据自己看官方文档的理解所做的一些记录,不是完整的翻译,希望也对敏捷大拇指上的各位Swift开发者有所帮助。

Swift 3.0之类和结构体 1

Swift 3.0之类和结构体 Swift 3.0 Classes and Structures - 敏捷大拇指 - Swift 3.0之类和结构体 1





2、类和结构体区别

Swift的类和结构体具有以下相同的特点:

  • 可以定义属性来保存值
  • 可以定义方法来提供功能
  • 可以定义下标来使用他们的值
  • 可以定义初始化器来配置他们的初始化状态
  • 可以在默认的实现上扩展他们的功能
  • 遵从协议来提供标准的功能


类具有结构体没有的额外的功能:

  • 继承允许某一个类继承另外一个类的特性
  • 类型转换允许你检查并在运行时解释一个类实例的类型
  • 析构器允许释放所有该类已经赋值的实例资源
  • 引用计数允许多个引用一个类的实例


结构体一般来说赋值的时候是直接拷贝的,没有使用引用计数的机制。




3、符号定义

下面是一个定义结构体和类的例子:

[Swift] 纯文本查看 复制代码
struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}


结构体初始化的时候可以直接

[Swift] 纯文本查看 复制代码
let vga = Resolution(width: 640, height: 480)


这点和类不一样,类没有默认的逐个成员的初始化器。




4、结构体和枚举是值类型

[Swift] 纯文本查看 复制代码
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd


再赋值

[Swift] 纯文本查看 复制代码
cinema.width = 2048


结果

[Swift] 纯文本查看 复制代码
print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"


然而hd.width还是1920

[Swift] 纯文本查看 复制代码
print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"


可见赋值过程是做了一次深度拷贝。

枚举也是具有同样的行为,如以下例子,rememberedDirection的值并没有改变:

[Swift] 纯文本查看 复制代码
enum CompassPoint {
    case north, south, east, west
}
var currentDirection = CompassPoint.west
let rememberedDirection = currentDirection
currentDirection = .east
if rememberedDirection == .west {
    print("The remembered direction is still .west")
}
// Prints "The remembered direction is still .west"


Swift 3.0之类和结构体 2

Swift 3.0之类和结构体 Swift 3.0 Classes and Structures - 敏捷大拇指 - Swift 3.0之类和结构体 2





5、类是引用类型

例如:

[Swift] 纯文本查看 复制代码
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0


进行赋值引用

[Swift] 纯文本查看 复制代码
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0


结果

[Swift] 纯文本查看 复制代码
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"





6、标识符

  • 完全相同(===)
  • 不完全相同(!===)


[Swift] 纯文本查看 复制代码
if tenEighty === alsoTenEighty {
    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."


完全相同(===)和等于(==)是不一样的:

  • 完全相同意思是两个类类型的常量或者变量指向完全相同的类实例
  • 等于意思是两个实例被认为值相同或者相等, 可以自行定义==操作符来进行判断两个实例在某种意义上是相等的





7、选择使用类和结构体

由于结构体的实例一般是值传递,而类实例一般是引用传递,因此你需要根据实际情况来考虑应该定义一个类还是结构体.

如有以下一种或多仲情况使用结构体:

  • 结构体主要的目的是封装少量的相关性简单数据值
  • 在结构体的实例赋值或者传递的时候,需要考虑到封装好的值会被拷贝而不是引用是否是合理的
  • 任何保存于结构体的属性都是值类型的,他们也是期望被赋值或者传递时是拷贝而不是引用
  • 结构体不需要从其他存在的类型继承属性或者行为


看看几个使用结构体恰当的例子:

  • 几何图形的大小,可以封装width和height属性,都是Double类型
  • 指向连续序列范围的方法,可以封装start和length属性,都是Int类型
  • 一个在3D坐标系统的点, 可以封装x, y和z属性,都是Double类型


其他的情况请定义类并创建类实例,管理和传递都使用引用。

在实践中,大部分的自定义数据结构都是使用类居多,很少使用结构体。




8、String、Array和Dictionary的赋值和拷贝行为

String, Array和 Dictionary都是结构体,因此赋值直接是拷贝,而NSString, NSArray 和NSDictionary则是类,所以是使用引用的方式。




作者:Mellong

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。您的赞赏是我前进的方向。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

Ding 发表于 2016-11-4 17:53:37 | 显示全部楼层
本帖最后由 Ding 于 2016-11-4 17:54 编辑

Array和Dictionary用了写时复制的技术,简单赋值并不拷贝,只有当真的要改变元素的时候才拷贝。这样做太创意。既有了引用类型的省内存好处,也有了值类型的安全好处。

Ding 发表于 2016-11-4 17:55:22 | 显示全部楼层
第一个回复里赋值写成了复制,已经改了。
 楼主| rightnow 发表于 2016-11-7 08:15:03 | 显示全部楼层
Ding 发表于 2016-11-4 17:53
Array和Dictionary用了写时复制的技术,简单赋值并不拷贝,只有当真的要改变元素的时候才拷贝。这样做太创 ...

wow~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

淘帖专辑
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
关闭

站长推荐 上一条 /1 下一条

热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表