源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Swift 3.0基础学习之类与结构体

  • 时间:2020-03-06 06:20 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Swift 3.0基础学习之类与结构体
[b]前言[/b] 和其他语言不同的是,Swift不需要为自定义的类和结构体创建接口和实现文件。只需要创建单一文件用来创建类和结构体,其他的外部接口的代码系统会自动生成。下面这篇文章主要介绍了关于Swift 3.0类与结构体的内容,感兴趣的朋友一起来看看吧。 [b]类和结构体区别[/b] Swift的类和结构体具有以下相同的特点: [list] [*]可以定义属性来保存值[/*] [*]可以定义方法来提供功能[/*] [*]可以定义下标来使用他们的值[/*] [*]可以定义初始化器来配置他们的初始化状态[/*] [*]可以在默认的实现上扩展他们的功能[/*] [*]遵从协议来提供标准的功能 [/*] [/list] 类具有结构体没有的额外的功能: [list] [*]继承允许某一个类继承另外一个类的特性[/*] [*]类型转换允许你检查并在运行时解释一个类实例的类型[/*] [*]析构器允许释放所有该类已经赋值的实例资源[/*] [*]引用计数允许多个引用一个类的实例[/*] [/list] 结构体一般来说赋值的时候是直接拷贝的,没有使用引用计数的机制。 [b]符号定义[/b] 下面是一个定义结构体和类的例子:
struct Resolution {
 var width = 0
 var height = 0
}
class VideoMode {
 var resolution = Resolution()
 var interlaced = false
 var frameRate = 0.0
 var name: String?
}
结构体初始化的时候可以直接
let vga = Resolution(width: 640, height: 480)
这点和类不一样,类没有默认的逐个成员的初始化器。 [b]结构体和枚举是值类型[/b]
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
再赋值
cinema.width = 2048
结果
print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"
然而hd.width还是1920
print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"
可见赋值过程是做了一次深度拷贝。 枚举也是具有同样的行为, 如以下例子,rememberedDirection的值并没有改变:
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"
[b]类是引用类型[/b] 例如:
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
进行赋值引用
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
结果
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"
[b]标识符[/b] [list] [*]完全相同(===)[/*] [*]不完全相同(!===)[/*] [/list]
if tenEighty === alsoTenEighty {
 print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
[b]完全相同(===)和等于(==)是不一样的:[/b] [list] [*]完全相同意思是两个类类型的常量或者变量指向完全相同的类实例[/*] [*]等于意思是两个实例被认为值相同或者相等, 可以自行定义==操作符来进行判断两个实例在某种意义上是相等的 [/*] [/list] [b]选择使用类和结构体[/b] 由于结构体的实例一般是值传递,而类实例一般是引用传递,因此你需要根据实际情况来考虑应该定义一个类还是结构体. 如有以下一种或多仲情况使用结构体: [list] [*]结构体主要的目的是封装少量的相关性简单数据值[/*] [*]在结构体的实例赋值或者传递的时候,需要考虑到封装好的值会被拷贝而不是引用是否是合理的[/*] [*]任何保存于结构体的属性都是值类型的,他们也是期望被赋值或者传递时是拷贝而不是引用[/*] [*]结构体不需要从其他存在的类型继承属性或者行为 [/*] [/list] 看看几个使用结构体恰当的例子: [list] [*]几何图形的大小,可以封装width和height属性,都是Double类型[/*] [*]指向连续序列范围的方法,可以封装start和length属性,都是Int类型[/*] [*]一个在3D坐标系统的点, 可以封装x, y和z属性,都是Double类型 [/*] [/list] 其他的情况请定义类并创建类实例,管理和传递都使用引用。 在实践中,大部分的自定义数据结构都是使用类居多,很少使用结构体。 [b]String、Array和Dictionary的赋值和拷贝行为[/b] 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 [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部