技术控

    今日:122| 主题:49179
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] [iOS] Swift 中的 Class 和 Structure

[复制链接]
别许诺 发表于 4 天前
84 0

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
LearniOS

  Swift

  Classes and Structures

  1、类的实例通常被看做一个对象。然而,Swift中的类和结构体在功能上比其他语言更加相似,本章所讨论的大部分实例都可以应用在类和结构体类型。因此,我们会主要使用实例。
  2、当结构体类型在你的代码中传递的时候,它们总是会拷贝。它不会使用引用计数。
  3、Classes和Structure的声明语法:
  1. class SomeClass {
  2. }
  3. struct SomeStructure {
  4. }
复制代码
4、当你定义一个新的类或者结构体的时候,你实际上就是在定义一种新的Swift类型。你应该使用    UpperCamelCase(eg:SomeClass/SomeStructure)这种命名方式来符合Swift的命名标准(eg:String/Int/Bool)。相反的,你应该用    lowerCamelCase来个属性或者方法来命名(eg:frameRate/incrementCount),以便和类型名区分。  
  1. struct Resolution {
  2.     var width = 0
  3.     var height = 0
  4. }
  5. class VideoMode {
  6.     var resolution = Resolution()
  7.     var interlaced = false
  8.     var frameRate = 0.0
  9.     var name: String?
  10. }
复制代码
5、不像Object-C,Swift可以直接设置结构体属性的紫属性的值。如下面的例子,someVideoMode的resolution的属性width的值可以直接设置,而不需要你在给resolution整个赋一个新值。
  1. struct Resolution {
  2.     var width = 0
  3.     var height = 0
  4. }
  5. class VideoMode {
  6.     var resolution = Resolution()
  7.     var interlaced = false
  8.     var frameRate = 0.0
  9.     var name: String?
  10. }
  11. let someVideo = VideoMode()
  12. someVideo.resolution.width = 200
复制代码
6、结构体另一种初始化方式:
  1. let vga = Resolution(width: 640, height: 480)
复制代码
类的实例不能这样初始化。
  7、值类型(Value Types):结构体、枚举、其它基本数据类型等都是值类型。当它在赋值给常量/变量或者传递给函数的时候,会拷贝值。通过下面的例子我们可以发现,虽然cinema的width值变了,但hd的width值并没有变。那是因为Resolution是一个结构体,在进行    var cinema = hd这一句的时候,系统会拷贝一份hd的值赋给cinema。它们两个是独立的两个结构体实例,所以改变cinema的值时,并不会影响hd。枚举同上。  
  1. let hd = Resolution(width: 1920, height: 1080)
  2. var cinema = hd
  3. cinema.width = 2000
  4. print(hd,cinema)
  5. //Resolution(width: 1920, height: 1080) Resolution(width: 2000, height: 1080)
复制代码
8、引用类型(Reference Types):当它们在赋值或者传递给函数的时候不会拷贝值,因此,应用的是已存在的实例本身,并没有拷贝。通过下面的例子我们可以看出,修改了alsoTenEighty的frameRate的值,tenEighty的frameRate的值页跟着改变了。因为类是引用类型,tenEighty和alsoTenEighty其实引用的是同一个VideoMode实例。实际上,它们只是同一个实例的两个不同的名字。
  1. let tenEighty = VideoMode()
  2. tenEighty.frameRate = 25.0
  3. let alsoTenEighty = tenEighty
  4. alsoTenEighty.frameRate = 30.0
  5. print(tenEighty.frameRate,alsoTenEighty.frameRate)
  6. //30.0 30.0
复制代码
9、通过    ===和    !==来判断两个实例是否为同一个类。  
  1. if tenEighty === alsoTenEighty {
  2.     print("yes")
  3. }
  4. //yes
复制代码
     ===和    ==是不同的,    ===代表两个类类型的常量或者变量医用同一个类的实例,而    ==代表两个常量或者变量的值相等。  
  10、在Swift中String、Array、Dictionary均已结构体的形式实现;Object-C中NSString、NSSArray、NSDictionary均已类的形式实现。
  11、在你的代码中,拷贝行为看起来似乎总会发生。然而,Swift在幕后只在绝对必要时才执行实际的拷贝。Swift管理所有的值拷贝以确保性能最优化,所以你没必要去回 避赋值来保证性能最优化。
友荐云推荐




上一篇:[从产品角度学EXCEL03]——单元格的秘密
下一篇:[iOS] Swift 中的 Functions
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表