• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >swift > Swift 3.0基础学习之类与结构体

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

作者:Mellong 字体:[增加 减小] 来源:互联网 时间:2017-05-28

Mellong 通过本文主要向大家介绍了Swift 3.0基础学习之类与结构体等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

前言

和其他语言不同的是,Swift不需要为自定义的类和结构体创建接口和实现文件。只需要创建单一文件用来创建类和结构体,其他的外部接口的代码系统会自动生成。下面这篇文章主要介绍了关于Swift 3.0类与结构体的内容,感兴趣的朋友一起来看看吧。

类和结构体区别

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

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

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

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

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

符号定义

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

struct Resolution {
 var width = 0
 var height = 0
}
class VideoMode {
 var resolution = Resolution()
 var interlaced = false
 var frameRate = 0.0
 var name: String?
}
</div>

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

let vga = Resolution(width: 640, height: 480)
</div>

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

结构体和枚举是值类型

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
</div>

再赋值

cinema.width = 2048
</div>

结果

print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"
</div>

然而hd.width还是1920

print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"
</div>

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

枚举也是具有同样的行为, 如以下例子,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"
</div>

类是引用类型

例如:

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
</div>

进行赋值引用

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
</div>

结果

print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"
</div>

标识符

  • 完全相同(===)
  • 不完全相同(!===)
if tenEighty === alsoTenEighty {
 print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
</div>

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

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

选择使用类和结构体

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

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

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

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

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

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

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28MyBatis快速入门
  • 2017-05-28struts2框架入门
  • 2017-05-28深入理解Swift中的访问控制关键字
  • 2017-05-28Swift面试题及答案整理
  • 2017-05-28深入解析Swift代理模式
  • 2017-05-28Swift编程中的一些类型转换方法详解
  • 2017-05-28Swift中Optional值的链式调用学习笔记
  • 2017-05-28Swift开发之UITableView状态切换效果
  • 2017-05-28Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
  • 2017-05-28Swift快速集成下拉刷新和上拉加载更多示例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Switch语句的技巧
    • 举例讲解Swift编程中switch...case语句的用法
    • Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍
    • 详解Swift的switch...case语句中break关键字的用法
    • Swift心得笔记之运算符
    • struts2实现文件下载功能
    • swift在IOS应用图标上添加提醒个数的方法
    • Swift操作Quartz 2D进行简单的绘图与坐标变换的教程
    • MyBatis 使用权威指南
    • Swift的函数式编程详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有