Swift 基础 ---类和结构体

广告推荐算法 - 学习笔记(持续更新中) 本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。 阅读详情
类和结构体

Swfit并不要求你为自定义类和结构去创建独立的接口和实现文件,只需要在一个文件定义一个类或结构体,Swift自动生成外部接口
通常类的实例被称为对象,Swift中称为实例而不是对象

1.定义

通过class和struct来声明结构体,大括号里定义它们的内容
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class SomeClass {  
  2.     // class definition goes here  
  3. }  
  4. struct SomeStructure {  
  5.     // structure definition goes here  
  6. }  
  7.   
  8.   
  9. struct Resolution {  
  10.     var width = 0  
  11.     var height = 0  
  12. }  
  13. class VideoMode {  
  14.     var resolution = Resolution()  
  15.     var interlaced = false  
  16.     var frameRate = 0.0  
  17.     var name: String?  
  18. }  

2.类和结构体的实例

使用初始化方法来生成新的实例
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. let someResolution = Resolution()  
  2. let someVideoMode = VideoMode()  

3.访问属性

使用点语法访问类和结构体的属性,或者子属性
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. println("The width of someResolution is \(someResolution.width)")  
  2. // prints "The width of someResolution is 0"  
  3.   
  4. println("The width of someVideoMode is \(someVideoMode.resolution.width)")  
  5. // prints "The width of someVideoMode is 0"  
  6.   
  7. someVideoMode.resolution.width = 1280  
  8. println("The width of someVideoMode is now \(someVideoMode.resolution.width)")  
  9. // prints "The width of someVideoMode is now 1280"  

4.结构体类型的初始化方法

所有结构体都有一个自动生成的初始化方法,用于初始化结构体中成员的属性
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. let vga = Resolution(width: 640, height: 480)  

5.结构体和枚举都是值类型的

值类型在赋值给变量、常量或者传入到一个函数的时候,操作的都是值的拷贝,意味着它们的实例以及实例所包含的属性在代码传值的时候都会被复制
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //以下定义一个hd常量,值为(1920,1080)像素的Resolution实例,然后定义cinema变量,其值为hd,cinema的值其实是hd得拷贝副本而不是hd本身,它们是两个不同的实例  
  2. let hd = Resolution(width: 1920, height: 1080)  
  3. var cinema = hd  
  4. //将cinema的width属性改变,而hd实例的中不会改变,两者的修改并不会相互影响对方,因为hd赋值给cinema的时候,实际是将hd存储的值进行拷贝,然后将拷贝的值存入cinema中  
  5. cinema.width=2048  
  6. println("cinema is now \(cinema.width) pixels wide")  
  7. // prints "cinema is now 2048 pixels wide"  
  8. println("hd is still \(hd.width) pixels wide")  
  9. // prints "hd is still 1920 pixels wide"  
枚举也是一样的
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. enum CompassPoint {  
  2.     case North, South, East, West  
  3. }  
  4. var currentDirection = CompassPoint.West  
  5. let rememberedDirection = currentDirection  
  6. currentDirection = .East  
  7. if rememberedDirection == .West {  
  8.     println("The remembered direction is still .West")  
  9. }  
  10. // prints "The remembered direction is still .West"  

6.类是引用类型

与值类型不同,引用类型赋予到一个变量或常量之后,操作的不是拷贝,而是实例本身
以下tenEighty和alsoTenEighty虽然是常量,但依然可以修改它们的属性,因为这两个常量本身不会被改变,仅仅存了ViewMode()实例的引用
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. let tenEighty = VideoMode()  
  2. tenEighty.resolution = hd  
  3. tenEighty.interlaced = true  
  4. tenEighty.name = "1080i"  
  5. tenEighty.frameRate = 25.0  
  6.   
  7. let alsoTenEighty = tenEighty  
  8. alsoTenEighty.frameRate = 30.0  
  9.   
  10. println("The frameRate property of tenEighty is now \(tenEighty.frameRate)")  
  11. // prints "The frameRate property of tenEighty is now 30.0"  

7.恒等运算符

因为类是引用类型,可能出现多个变量在引用同一个类实例的情况,所以Swift提供了两个恒等运算符,判断两个常量或者变量是否引用同一个类实例
 等价于( === ) 表示两个类类型的常量或变量引用同一个实例
 不等价( !== )
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if tenEighty === alsoTenEighty {  
  2.     println("tenEighty and alsoTenEighty refer to the same Resolution instance.")  
  3. }  
  4. // prints "tenEighty and alsoTenEighty refer to the same Resolution instance."  

8.类和结构体的选择

结构体:
值传递
主要用来封装少量相关简单的数据值
构建一个实例在赋值或传递时,要明确封装的数据是被拷贝而不是引用
在结构体中存储的值类型属性,都是被拷贝而不是引用
结构体不需去继承另一个已存在在类型的属性或行为
在实际应用中,绝大部分的自定义数据都应该是类,而非结构体

9.集合类型的赋值和拷贝行为

Swift中的数组和字典都是结构体,当数组被赋值给一个常量或变量,或传递到函数或方法时,和字典的拷贝都与其他结构体有不同

字典类型的赋值和拷贝
如果字典中存储的key/value是值类型,在赋值或调用时,都会被拷贝,如果是引用类型,将会被引用
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //以下字典key/value 分别是String/Int,都是值类型,字典被拷贝时,两者都被拷贝  
  2. var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]  
  3. var copiedAges = ages  
  4. copiedAges["Peter"] = 24  
  5. println(ages["Peter"])  
  6. // prints "23"  

数组的赋值和拷贝
数组的赋值和拷贝要比字典复杂,当操作数组时能提供接近C语言的功能,并且拷贝行为只在必要时才发生,将数组赋值给其他变量时,数组的内容不会被拷贝,而是被共享出来公用一个,当数组元素被修改,在另一组数组也显示同样的结果,而拷贝行为只在修改了数组长度的时候发生,发生拷贝的情况与字典类似
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. //将整数(Int)数组赋值给a,b,c变量  
  2. var a = [1, 2, 3]  
  3. var b = a  
  4. var c = a  
  5.   
  6. println(a[0])  
  7. // 1  
  8. println(b[0])  
  9. // 1  
  10. println(c[0])  
  11. // 1  
  12.   
  13. a[0] = 42  
  14. println(a[0])  
  15. // 42  
  16. println(b[0])  
  17. // 42  
  18. println(c[0])  
  19. // 42  
  20.   
  21. //当长度发生变化,Swift会创建这个数组的拷贝,a将会是原数组的一个独立拷贝  
  22. a.append(4)  
  23. a[0] = 777  
  24. println(a[0])  
  25. // 777  
  26. println(b[0])  
  27. // 42  
  28. println(c[0])  
  29. // 42  

10.确保数组的唯一性

操作数组的时候有必要确认这个数组是有一个唯一拷贝的,调用unshare方法确定数组引用的唯一性,如果一个数组被多个变量引用,在其中的一个变量调用unshare方法则会拷贝此数组,此时这个变量会有属于他自己的独立数组拷贝。
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. b.unshare()  
  2. b[0] = -105  
  3. println(a[0])  
  4. // 777  
  5. println(b[0])  
  6. // -105  
  7. println(c[0])  
  8. // 42  

11.判断两个数组是否共用相同元素

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if b === c {  
  2.     println("b and c still share the same array elements.")  
  3. } else {  
  4.     println("b and c now refer to two independent sets of array elements.")  
  5. }  
  6. // prints "b and c now refer to two independent sets of array elements."  
或者判断两个数组是否共用相同的元素
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if b[0...1] === b[0...1] {  
  2.     println("These two subarrays share the same elements.")  
  3. } else {  
  4.     println("These two subarrays do not share the same elements.")  
  5. }  
  6. // prints "These two subarrays share the same elements."  

12.强制复制数组

通过调用copy方法进行强制复制,这方法对数组进行浅拷贝,并返回一个包含此拷贝的新数组,
[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var names = ["Mohsen", "Hilary", "Justyn", "Amy", "Rich", "Graham", "Vic"]  
  2. var copiedNames = names.copy()  
  3. copiedNames[0] = "Mo"  
  4. println(names[0])  
  5. // prints "Mohsen"  
unshare方法仅会在确认有必要的时候菜户创建数组拷贝,copy方法在任何时候都会创建新的拷贝,即使引用已经是唯一的
YOLOv8改进:注意力系列篇 |高效的通道先验卷积注意力(CPCA) | 中科院 2023.6 高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布; 阅读详情

相关推荐

YOLOv8实战:5分钟搞定Windows环境下的目标检测模型部署(附常见报错解决方案)

本文详细介绍了在Windows环境下快速部署YOLOv8目标检测模型的实战指南,包括环境配置、模型加载、快速验证及常见报错解决方案。通过5分钟快速入门教程,帮助开发者高效实现计算机视觉应用,特别适合需要快速上手的AI开发者。

weixin_30566063的博客 556

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

Swift的类和结构体

Cain For iOS的专栏 435

WiFi信道状态信息 基于Intel 5300的CSI Tool 安装及使用(一)

经过半个月的坎坷安装过程,连Windows系统都没装过的本人终于颤颤巍巍把CSI TOOL装好了,下面记录一下适于我所使用设备的安装过程。设备:一台THINKPAD X201,一台师兄借的华硕主板的台式机首先,如果你和我一样对linux其实一窍不通的话,建议先反复看教程里的安装代码,照猫画虎很难一步实现的,中途一定会有这或那的问题需要解决,所以该了解的基础linux指令还是要了解,起码安装过程中的那些指令可以去查一查。.........

Silver_777的博客 2万+

Swift基础 结构体和类

Swift中,库中大部分都是有结构体实现的。struct Person { var name: String let age: Int }构造器结构体会默认提供一个成员逐一构造器var person = Person(name: "Johan", age: 20)如果在写结构体时,属性已经设置值了,或者属性是可选类型,可以这么创建结构体struct Person { var

JohanMan的博客 420

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

Coding... 5498

Swift 基础学习(结构体和类)

/* Swift结构体和类的初步 (1)结构体定义 (2)结构体实例和属性访问 (3)结构体的构造器 (4)给结构体加上方法 (5)结构体是指引用 (6)类定义 (7)类和结构体的比较 (8)类是引用类型 (9)恒等运算符 *///(1)定义一个结构体 //struct+结构体名 struct Rect { var width: Double; var height: Double

zhouwenchun 450

【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」

WorkBuddy专家与专家团:专业级AI协作解决方案 WorkBuddy的专家(Expert)与专家团(Expert Team)功能颠覆了通用AI的局限性,提供角色化、可交付的专业服务。 核心优势 专家:深度垂直领域的AI顾问,具备人设、方法论、工具链,如全栈开发专家能直接交付完整项目,而非代码片段。 专家团:多智能体协作,自动拆解复杂任务(如竞品分析、全栈开发)并分发给对应角色,并行执行后整合输出,效率提升显著。 使用场景 单专家:解决专业问题(如SQL优化、UI设计)。

AI人人懂 2010

swift基础笔记4-类和结构体

类和结构体对比类和结构体是人们构建代码所用的一种通用且灵活的构造体。我们可以使用完全相同的语法规则来为类和结构体 定义属性(常量、变量)和添加方法,从而扩展类和结构体的功能。 Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在 一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。类和结构体对比Swift 中类和结构体有很多共同点。共同处在于:

Fighting的专栏 511

MAX30102心率血氧传感器原理图设计,已量产(e-Health传感器)

在最近的便携健康监测设备项目中,我们采用了集成算法的 MAX30102 心率血氧模块 —— 这类带内置 MCU 算法的传感器能直接输出心率 / 血氧数值,大幅降低了主控资源占用。但硬件电路的稳定性直接决定了 PPG 信号的采集精度,下面结合实际项目里的原理图,拆解下这个模块的设计细节。

不脱发的程序猿 1276

Python爬虫实战:京东/淘宝商品价格与评论监控系统——从User-Agent伪装到编码陷阱的全面攻克

在电商数据驱动决策的今天,无论是个人消费者想抓住历史低价,还是市场分析师需要追踪竞品动态,抑或是算法交易员依赖实时价格信号,自动化的商品价格与评论监控系统都已成为不可或缺的工具。然而,电商平台的反爬虫策略日益严苛,字符编码的“暗坑”更是让初学者屡屡碰壁。本文将以京东(JD.com和淘宝(Taobao.com两大主流平台为目标,手把手带你构建一个稳定、高效的商品监控爬虫。User-Agent伪装——如何模拟真实浏览器行为,突破初级反爬。GBK/UTF-8编码混战。

2201_76125261的博客 73

Swift基础--类和结构体

类和机构提是人们构建代码所有的一种通用且灵活的结构体.为了在类和结构体中实现各种功能,我们必须严格按照常量,变量及函数锁规定的语法规则来定义属性和添加方法.与其他编程语言不同的是swift并不是要求我们为自定义的类和结构体去创造独立的接口和实现文件.我们所需要做的只是在一个单一文件中定义一个类或结构体,系统将会自动生成面向其他代码的外部接口. 一,类和结构体的对比 1.1 类和结构体共同点 定义...

weixin_34117522的博客 138

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。

龚礼鹏的博客 2544

swift基础day4---结构体和类

结构体和类对比 共同点: 定义属性用于存储值 定义方法用于提供功能 定义下标操作用于通过下标语法访问它们的值 定义构造器用于设置初始值 通过扩展以增加默认实现之外的功能 遵循协议以提供某种标准功能 不同点:优先使用结构体,因为它们更容易理解,仅在适当或必要时才使用类。 继承允许一个类继承另一个类的特征 类型转换允许在运行时检查和解释一个类实例的类型 析构器允许一个类实例释放任何其所被分配的资源 引用计数允许对一个类的多次引用 类实例没有默认的成员逐一构造器 命名:类和结构体命名使用大写,属性和方法使用小写

b_8196_p的博客 264

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Swift基础(五):类和结构体

目录: 类和结构体初始化 类是引用类型 恒等运算符 指针 类和结构体的选择 字符串(String)、数组(Array)、和字典(Dictionary)类型的赋值与复制行为 //类和结构体初始化 struct ResolutionStruct//结构体 {     var width = 0;     var height

ceasadan的博客 384

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Swift面向对象基础(上)——Swift中的类和结构体(上)

学习来自《极客学院》 1 import Foundation 2 3 //1.定义类和结构体 4 /* 5 [修饰符]calss 类名{ 6 零到多个构造器 7 零到多个属性 8 零到多个方法 9 零到多个下标 10 } 11 修饰符可以是:private public internal final 12 */ 13 14 /*...

weixin_34409703的博客 106

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Swift6.1 - 基础知识2: 对象和类、枚举和结构体、并发性

本文介绍了Swift中类和枚举的基本用法。在类部分,详细说明了类的定义、属性声明、方法创建、构造器(init)和析构器(deinit)的使用,以及继承和重写(override)的注意事项。文中还展示了计算属性(getter/setter)和属性观察器(willSet/didSet)的实现方式。在枚举部分,讲解了如何定义带有原始值的枚举(enum),包括访问原始值(rawValue)和通过原始值初始化枚举实例的方法。文章通过多个代码示例(如Shape、Square、Rank等)演示了这些概念的实际应用,并提供

chenzimin_blog 862

Swift面向对象基础(上)——Swift中的类和结构体(下)

学习来自《极客学院》 1 import Foundation 2 3 class User { 4 var name:String 5 var age:Int 6 init(name:String,age:Int){ 7 self.age = age 8 self.name ...

weixin_34355715的博客 110

swift基础学习(04)[闭包、函数、枚举、类和结构体]

闭包、函数、枚举、类和结构体

抽筋的小乌龟 1000

swift 中类和结构体的默认构造器-init方法

swift 类和结构体的默认构造器1. 开发环境说明2. 空合运算符??3. 类自动生成的init方法4. 结构体自动生成的init方法5. 养眼图片欣赏 1. 开发环境说明 系统版本:macOS Catalina 10.15.4 Xcode版本: Version 11.5 (11E608c) swift版本: Apple Swift version 5.2.4 (swiftlang-1103.0.32.9 clang-1103.0.32.53). 2. 空合运算符?? ?? 被命名为空合运算符 let

xuanwenchao的专栏 1461
上一篇: Swift中利用单例 融合 FMDB数据库
下一篇: 高效的程序员是聪明和懒惰的
皓浩
博客等级 码龄18年 157粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值