首页 > 其他分享 >Swift开篇007->类和结构体

Swift开篇007->类和结构体

时间:2023-02-01 12:34:37浏览次数:47  
标签:开篇 tenEighty frameRate 实例 007 引用 var Swift VideoMode


PART_A 类&结构体对比

  1. 共同点
  • 定义属性:存储值
  • 定义方法:提供功能
  • 定义附属脚本:访问值
  • 定义构造器:生成初始化值
  • 通过扩展增加默认实现的功能
  • 实现协议以提供某种标准功能
  1. 类的附加功能
  • 继承允许一个类继承另一个类的特征
  • 类型转换允许在运行时检查和解释一个类实例的类型
  • 析构器允许一个类实例释放任何其所被分配的资源
  • 引用计数允许对一个类的多次引用(结构体总是通过被复制的方式在代码中传递,不使用引用计数)
  1. 语法格式
// 结构体
struct Resolution {
// 当赋值 0 时,类型推断 wdith 为 Int 类型
var width = 0
var height = 0
}
// 类
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String?
}
  1. 实例创建
let demoResolution = Resolution()
let demoVideoMode = VideoMode()
  1. 属性访问&变量属性赋值
  • 对象.属性名
  • 对象.属性名 = 值
  1. 结构体类型的成员逐一构造器
  • 所有结构体的新实例中各属性的初始值可通过属性的名称传递到成员逐一构造器中
`let vga = Resolution(width: 640, height: 480)`

PART_B 结构体和枚举是值类型

  1. 所有基本类型(整型Integer、浮点型Float、布尔型Boolean、字符串String、数组Array、字典Dictionary)、枚举、结构体都是值类型. 赋值时仅为拷贝副本
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
// cinima.width 值为 2048, hd.width 值为 1920
  1. 类是引用类型:引用的是已存在的实例本身而不是其拷贝
let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0


let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
// tenEighty.frameRate 值为 30.0

需要注意的是 tenEighty 和 alsoTenEighty 被声明为常量而不是变量. 然而你依然可以改变 tenEighty.frameRate 和 alsoTenEighty.frameRate,因为 tenEighty 和 alsoTenEighty 这两个常量的值并未改变. 它们并不“存储”这个 VideoMode 实例,而仅仅是对 VideoMode 实例的引用. 所以,改变的是被引用的 VideoMode 的 frameRate 属性,而不是引用 VideoMode 的常量的值

  1. 恒等运算:===​==​
  • ===:两个类类型的常量或变量引用同一个类实例
  • ==:两个实例的值相等
  1. 指针

PART_C 类和结构体的选择

  1. 大部分场景还是需要定义类,生成实例,通过引用来管理和传递
  2. 结构体场景
  • 该数据结构的主要目的是封装少量相关简单数据值
  • 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用
  • 该数据结构中存储的值类型属性,也应该被拷贝,而不是被引用
  • 该数据结构不需要去继承另一个既有类型的属性或者行为
    ​​如定义几何形状:长宽高、三维坐标系内一点:xyz等

补充

1…Swift String​Array​​Dictionary​以结构体的形式实现,即被赋值给新的常量或变量、或被传入方法中时,其值会被拷贝

2…OC 中 NSString​NSArray​​NSDictionary​ 类型均以类的形式实现,其不会发生值拷贝,而是传递现有实例的引用


标签:开篇,tenEighty,frameRate,实例,007,引用,var,Swift,VideoMode
From: https://blog.51cto.com/u_15950249/6031344

相关文章

  • Swift开篇009->方法
    PART_A实例方法简介实例方法:可属于某个特定类、结构体或枚举实例的方法实例方法能隐式访问它所属类型的所有其他实例方法和属性实例方法只能被它所属的类的某个特定实例调......
  • Swift开篇004->集合
    PART_O集合简介集合长度默认可变,若分配成常量,则其大小和内容皆不可变Swift集合类型(必须通过泛型明确存储值)​​Arrays​​:数组,有序可重复​​Sets​​:集合,无序不重复​​......
  • Swift开篇005->闭包
    PART_A背景闭包的概念:自包含的函数代码块,可以在代码中被传递和使用.用简洁语法构建内联闭包闭包的三种形式全局函数是一个有名字但不会捕获任何值的闭包嵌套函数是一个有......
  • Swift开篇003->控制流、函数
    PART_A控制流​​for​​​​for...in​​forindexin1...5{print(index)}letnames=["cat","dog","fish"]fornameinnames{print(name)}letnums=......
  • Swift开篇001->新建Swift工程
    最近看了点​​Swift的教程​​,在此做个笔记,那就从Xcode新建一个Swift工程开始吧​​File->New->Project​​​​OSX->Application->CommandLineTool​​​​填......
  • Swift开篇002->基本运算符
    PART_A运算符赋值运算符:​​=​​普通赋值varnumnum=5元组赋值let(x,y)=(0,0)​​=​​操作不返回任何值算数、组合赋值、自增自减、、负号、字符串拼接求余时符号......
  • Windows11 WSL 打开Ubuntu 报错 WslRegisterDistribution failed with error: 0x80070
    Windows11WSL打开Ubuntu报错WslRegisterDistributionfailedwitherror:0x800701bc 1、背景说明Windows在不安装虚拟化软件的情况下,如果想安装Linux子系统,可以......
  • Aforge.net之旅——开篇:从识别验证码开始
    时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈。。。前几天老大问我怎么这么长时间都没写博客了,好吧,继续坚持,继续分享......
  • docker(开篇)
    Docker概念:是基于Go语言实现的云开源项目。Docker的主要目标是“Buid,ShipandRunAnyAppAnywhere”;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,......
  • 这是一个开篇
    设想一个自动驾驶系统,有次在路上发生了追尾,撞坏了前车,事后它的教练向它提出一连串问题,诸如:你是否认为自己犯了个错误?说说当时发生了什么?你当时是怎么想的?为什么没有及时踩......