时间:2021-05-02
前言
和其他语言不同的是,Swift不需要为自定义的类和结构体创建接口和实现文件。只需要创建单一文件用来创建类和结构体,其他的外部接口的代码系统会自动生成。下面这篇文章主要介绍了关于Swift 3.0类与结构体的内容,感兴趣的朋友一起来看看吧。
类和结构体区别
Swift的类和结构体具有以下相同的特点:
类具有结构体没有的额外的功能:
结构体一般来说赋值的时候是直接拷贝的,没有使用引用计数的机制。
符号定义
下面是一个定义结构体和类的例子:
? 1 2 3 4 5 6 7 8 9 10 struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }结构体初始化的时候可以直接
? 1 let vga = Resolution(width: 640, height: 480)这点和类不一样,类没有默认的逐个成员的初始化器。
结构体和枚举是值类型
? 1 2 let hd = Resolution(width: 1920, height: 1080) var cinema = hd再赋值
? 1 cinema.width = 2048结果
? 1 2 print("cinema is now \(cinema.width) pixels wide") // Prints "cinema is now 2048 pixels wide"然而hd.width还是1920
? 1 2 print("hd is still \(hd.width) pixels wide") // Prints "hd is still 1920 pixels wide"可见赋值过程是做了一次深度拷贝。
枚举也是具有同样的行为, 如以下例子,rememberedDirection的值并没有改变:
? 1 2 3 4 5 6 7 8 9 10 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"类是引用类型
例如:
? 1 2 3 4 5 let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0进行赋值引用
? 1 2 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0结果
? 1 2 print("The frameRate property of tenEighty is now \(tenEighty.frameRate)") // Prints "The frameRate property of tenEighty is now 30.0"标识符
完全相同(===)和等于(==)是不一样的:
选择使用类和结构体
由于结构体的实例一般是值传递,而类实例一般是引用传递,因此你需要根据实际情况来考虑应该定义一个类还是结构体.
如有以下一种或多仲情况使用结构体:
看看几个使用结构体恰当的例子:
其他的情况请定义类并创建类实例,管理和传递都使用引用。
在实践中,大部分的自定义数据结构都是使用类居多,很少使用结构体。
String、Array和Dictionary的赋值和拷贝行为
String, Array和 Dictionary都是结构体,因此赋值直接是拷贝,而NSString, NSArray 和NSDictionary则是类,所以是使用引用的方式。
参考英语原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://devlong.com/2016/11/02/swift-classes-and-structures/
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、引言Swift中的类与结构体十分相似,和Objective-C不同的事,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法。Swift中的类与
Swift结构体是构建代码所用的一种通用且灵活的构造体。我们可以为结构体定义属性(常量、变量)和添加方法,从而扩展结构体的功能。与C和ObjectiveC不同的
前言在Swift3.0以前有三种访问控制关键字,分别是private、internal和public。而在swift3以后,又在原来的基础上增加了两种访问控制关
概述相对Objective-C,Swift使用结构体Struct的比例大大增加了,其中Int,Bool,以及String,Array等底层全部使用Struct来
基础类型虽然Swift是一个为开发iOS和OSXapp设计的全新编程语言,但是Swift的很多特性还是跟C和Objective-C相似。Swift也提供了与C和