类和结构体

可以通过使用常量、变量和函数完全相同的语法来定义属性和方法向类和结构添加功能。

Swift不需要为自定义类和结构创建单独的接口和实现文件,只需要在单个文件中定义一个类或结构体Swift会自动形成对其他代码可用的外部接口。

比较类和结构体

类和结构体的共同之处:

  • 定义属性以存储值
  • 定义方法以提供功能
  • 定义下标使用下标语法提供对其值的访问
  • 定义初始化器以设置其初始状态
  • 扩展默认实现的功能
  • 遵循协议以提供某种特定功能

类具有的附加功能:

  • 继承另一个类的特性
  • 类型转换使得在运行时检查和解释类实例的类型
  • 析构器以释放其内存
  • 引用计数允许对类实例的多个引用

注意

结构体是值类型,且没有引用计数,类是引用类型。

定义语法

类和结构体定义语法类似,分别使用classstruct关键字。

class SomeClass {// class definition goes here
}
struct SomeStructure {// structure definition goes here
}

注意

类和结构体的类型名采用首字母大写的驼峰命名法,属性和方法采用小写的。

类和结构体的定义示例:

struct Resolution {var width = 0var height = 0
}
class VideoMode {var resolution = Resolution()var interlaced = falsevar frameRate = 0.0var name: String?
}

类和结构体的实例

类和结构体创建实例的语法也非常相似:

let someResolution = Resolution()
let someVideoMode = VideoMode()

类和结构体创建实例都使用初始化器,初始化器的最简单形式是使用类或结构体的类型名,后跟空括号。这样会将所有属性初始化为默认值。

访问属性

使用点语法访问实例的属性。

print("The width of someResolution is \(someResolution.width)")
// Prints "The width of someResolution is 0"

Swift可以直接设置结构属性的子属性:

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"

使用点语法给变量属性设置新值:

someVideoMode.resolution.width = 1280
print("The width of someVideoMode is now \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is now 1280"

结构体类型的成员初始化器

所有结构体会自动生成一个成员初始化器,通过名称将实例的属性的初始化值传递给成员初始化器:

let vga = Resolution(width: 640, height: 480)

而类结构不生成默认的成员初始化器。

结构体和枚举是值类型

值类型是将值分配给变量或常量或将其传递给函数时复制其值的类型,改变其中一个而不会影响另一个。

Swift中的所有基本数据类型都是值类型,包括结构体和枚举。

说明结构体是值类型的示例:

let hd = Resolution(width: 1920, height: 1080)
var cinema = hdcinema.width = 2048print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"

说明枚举是值类型的示例:

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"

类是引用类型

当引用类型被分配给变量或常量或将其传递给函数时,不会复制引用类型,而是直接使用原实例的引用,这意味着修改其中一个值会直接反映到另一个值。

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"

上述的类实例都分配给了常量,修改实例的属性对常量本身的值无影响,只是改变内部的属性,未修改其引用。

等于运算符

使用等于运算符判断两个常量或变量是否为相同的类实例,即同一个引用,有两个相等运算符:

  • 想等 (===)
  • 不想等 (!==)

`

if tenEighty === alsoTenEighty {print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."

指针

C和Objective-C语言中使用指针来引用内存地址,而Swift中引用某个引用类型的实例与指针类似,但不是直接指向内存地址的指针,创建引用也不需要使用星号(*)。

选择类与结构体

使用类和结构体来定义复杂的自定义数据类型。

值类型和引用类型意味着结构体和类适合于不同类型的任务,依据以下原则考虑将一个数据类型定义为一个结构体:

  • 结构体的主要目的是封装一些相对简单的数据值。
  • 在分配或传递该实例时,期望封装的值将被复制会更加合理,而不是引用。
  • 由结构体存储的任何属性本身都是值类型,也将被复制。
  • 结构体不需要从另一个现有类型继承属性或方法。

以下为使用结构体的一些好的例子:

  • 几何形状的大小,封装了均为Double类型的width属性和height属性。
  • 代表一系列值的范围,封装了均为Int类型的start属性和length属性。
  • 3D坐标系统的一个点,封装了均为Double类型的xyz属性。

以上原则说明,封装的属性都是数值类型时通常选择结构体。

在所有其他条件下,定义为一个类,并创建要通过引用进行管理和传递的类的实例。,这意味着大多数自定义数据结构应该是类而不是结构。

转载于:https://www.cnblogs.com/keqipu/p/7624512.html

Swift教程之类和结构体相关推荐

  1. Swift 中枚举、结构体、类(enum、struct、class)

    Swift 中枚举.结构体.类(enum.struct.class) Swift中的枚举与OC相比不会自动分配初始值,值的类型不会限定为整数,可以给定关联值类型和具体值(整型.浮点型.字符型(Swif ...

  2. Swift基础语法: 25 - Swift的类和结构体

    在我们实际开发的过程中, 类和结构体是人们创建代码时所用的一种通用且灵活构造体, 为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法. 但是在 ...

  3. Swift学习笔记-005结构体和类(疯狂swift讲义第二版)

    1.定义类及类相关的一切 定义类的一般语法 [修饰符] class 类名{ //类的语句 } 定义结构体的一般语法 [修饰符] class 类名{ //结构体的语句 } 定义存储属性的一般语法 [修饰 ...

  4. Swift学习:类和结构体

    类和结构体是人们构建代码所用的一种通用且灵活的构造体.我们可以使用完全相同的语法规则来为类和构造体定义属性(常量.变量)和添加方法,从而扩展类和构造体的功能. 与其他编程语言所不同的是,swift 并 ...

  5. swift选择类或结构体

    按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体: 结构体的主要目的是用来封装少量相关简单数据值.  有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用. ? 任何在 ...

  6. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

  7. Swift -- 7.3 类和结构体

    swift的类和结构体高度相似,无论是定义语法还是用法上,swift的类和结构体都具有高度的相似性 区别是:结构体不支持继承(自然也不支持类型转换了.....这个,还不太理解) 结构体不支持定义析构器 ...

  8. Swift 类和结构体总结

    Swift 类和结构体总结 类和结构体都是多功能而且灵活的结构,它们可以作为构建块(building block)在代码中使用.你可以为类和结构体定义属性和方法来扩充它们的功能.对于自定义类,Swif ...

  9. Swift Struct结构体

    一天一步,快乐前进: 结构体: 结构体就是结构化程序的产物.结构体是由另个或多个类型相同或者不同的数据组成的数据集合,其中的数据或者方法被称为它的成员或成员方法.结构体的成员可以包括属性,类型别名.数 ...

最新文章

  1. 手把手教你AndroidStudio多渠道打包
  2. 【vue】webpack打包vue项目并且运行在Tomcat里面
  3. MySQL 3.23 中文参考手册
  4. 浅析网站前期哪些制作是能够方便后期优化的?
  5. 安全篇:弱密码python检测工具
  6. Netty 4.x – ByteBuf
  7. python 网格交易源码下载_GitHub - xiongyixiaoyang/grid-trading: 网格交易(期货) ,基于网格交易方法的交易策略...
  8. 辽宁交通高等专科学校计算机专业宿舍,辽宁省交通高等专科学校宿舍条件怎么样 有独立卫生间和空调吗...
  9. jsp:include标签与include指令的区别
  10. 手把手教你nginx下如何增加网站
  11. 三星Galaxy S22或放弃Exynos 2200?假消息!依旧双版本
  12. VMware vSphere功能特性比较 6.5 6.7 7.0
  13. vivoy27android版本,vivo Y27手机系统是什么?vivo Y27能升级安卓4.3吗?
  14. Lucene知识小总结8:索引查询
  15. win10怎么更新显卡驱动_更新Win10设备驱动程序的4种方法,方便实用,你知道几种...
  16. REST服务和RESTful API是什么
  17. 又一程序员删库跑路被判刑,切勿冲动
  18. win10下如何使用linux系统
  19. 从零开始的WTL入门教程(1) WTL的简介,环境搭建
  20. Weblogic安装时闪退,无法进行下一步问题

热门文章

  1. lisp修改天正标高值_【求教】如何批量修改天正字体
  2. html弹窗赋值给查询框,bootstrap模态框动态赋值, ajax异步请求数据后给id为queryInfo的模态框赋值并弹出模态框(JS)...
  3. html5复合选择器,web前端练习31----Css,选择器(基本选择器,复合选择器,属性选择器,伪类,伪元素,优先级,雪碧图练习)...
  4. linux 脚本发邮件短信,shell 监控脚本 短信告警
  5. c语言存储多个数据,C语言中如何求数组真实存有数据的元素个数
  6. 网站如何进行渠道跟踪_开发网站不知道如何进行推广?5个技巧教会你
  7. 简书 java jvm_JVM介绍
  8. php 怎么支持中文图片显示,给图片添加水印(支持中文)并生成缩略图_php
  9. Redis的学习记录
  10. 在Paddle中利用AlexNet测试CIFAR10数据集合