IOS Swift : 从入门到精通结构、属性和方法 结构体,第一部分

文章目录

  • 创建自己的结构
  • 计算属性
  • 属性观察者
  • 方法
  • 变异方法
  • 字符串的属性和方法
  • 数组的属性和方法

创建自己的结构

Swift 允许你以两种方式设计自己的类型,其中最常见的是结构,或简称为structs。结构可以拥有自己的变量和常量,以及自己的函数,然后可以按照你想要的方式创建和使用。

让我们从一个简单的例子开始:我们将创建一个将Sport其名称存储为字符串的结构。结构中的变量称为属性,因此这是一个具有一个属性的结构:

struct Sport {var name: String
}

这定义了类型,所以现在我们可以创建并使用它的一个实例:

var tennis = Sport(name: "Tennis")
print(tennis.name)

我们将两者都设为name变量tennis,因此我们可以像常规变量一样更改它们:

tennis.name = "Lawn tennis"

属性可以像常规变量一样具有默认值,并且通常可以依赖 Swift 的类型推断。

计算属性

我们刚刚创建了一个Sport这样的结构:

struct Sport {
var name: String
}
它有一个name属性,用于存储String。这些被称为存储属性,因为 Swift 有一种称为计算属性的不同类型的属性- 运行代码来找出其值的属性。

我们将向结构体添加另一个存储属性Sport,然后添加一个计算属性。如下所示:

struct Sport {var name: Stringvar isOlympicSport: Boolvar olympicStatus: String {if isOlympicSport {return "\(name) is an Olympic sport"} else {return "\(name) is not an Olympic sport"}}
}

如您所见,olympicStatus看起来像常规的String,但它根据其他属性返回不同的值。

我们可以通过创建一个新的实例来尝试一下Sport:

let chessBoxing = Sport(name: "Chessboxing", isOlympicSport: false)
print(chessBoxing.olympicStatus)

属性观察者

属性观察器可让你在任何属性更改之前或之后运行代码。为了演示这一点,我们将编写一个Progress跟踪任务和完成百分比的结构:

struct Progress {var task: Stringvar amount: Int
}

我们现在可以创建该结构的实例并随时间调整其进度:

var progress = Progress(task: "Loading data", amount: 0)
progress.amount = 30
progress.amount = 80
progress.amount = 100

我们希望Swift 每次发生更改时都打印一条消息amount,我们可以使用属性观察器来实现这一点。每次更改didSet时都会运行一些代码:amount

struct Progress {var task: Stringvar amount: Int {didSet {print("\(task) is now \(amount)% complete")}}
}

您还可以使用它在属性改变之前willSet采取行动,但这很少使用。

方法

结构体中可以包含函数,这些函数可以根据需要使用结构体的属性。结构体中的函数称为方法,但它们仍使用相同的func关键字。

我们可以用一个City结构体来演示这一点。它将有一个population存储城市中有多少人的属性,以及一个collectTaxes()返回人口数乘以 1000 的方法。因为该方法属于City它可以读取当前城市的population属性。

代码如下:

struct City {var population: Intfunc collectTaxes() -> Int {return population * 1000}
}

该方法属于结构体,因此我们像这样在结构的实例上调用它:

let london = City(population: 9_000_000)
london.collectTaxes()

变异方法

如果结构体具有变量属性,但该结构的实例是作为常量创建的,则该属性无法更改 - 该结构体是常量,因此无论其如何创建,其所有属性也都是常量。

问题是,当你创建结构体时,Swift 不知道你是否将它与常量还是变量一起使用,因此默认情况下它采用安全的方法:除非你特别要求,否则 Swift 不会让你编写改变属性的方法。

当您想要更改方法内的属性时,您需要使用mutating关键字标记它,如下所示:

struct Person {var name: Stringmutating func makeAnonymous() {name = "Anonymous"}
}

Person因为它改变了属性,所以 Swift 只允许在变量实例上调用该方法:

var person = Person(name: "Ed")
person.makeAnonymous()

字符串的属性和方法

到目前为止,我们已经使用了很多字符串,事实证明它们是结构体——它们有自己的方法和属性,我们可以用来查询和操作字符串。

首先,让我们创建一个测试字符串:

let string = "Do or do not, there is no try."

您可以使用其属性读取字符串中的字符数count:

print(string.count)

他们有一个hasPrefix()方法,如果字符串以特定字母开头则返回 true:

print(string.hasPrefix("Do"))

您可以通过调用其方法将字符串变为大写uppercased():

print(string.uppercased())

你甚至可以让 Swift 将字符串的字母排序到数组中:

print(string.sorted())

字符串有更多的属性和方法——尝试输入string.以调出 Xcode 的代码完成选项。

数组的属性和方法

数组也是结构,这意味着它们也有自己的方法和属性,我们可以使用它们来查询和操作数组。

这是一个帮助我们入门的简单数组:

var toys = ["Woody"]

您可以使用数组的属性读取数组中的项目数count:

print(toys.count)

如果要添加新项目,请使用append()如下方法:

toys.append("Buzz")

您可以使用其方法定位数组内的任何项目firstIndex(),如下所示:

toys.firstIndex(of: "Buzz")

这将返回 1,因为数组从 0 开始计数。

就像字符串一样,你可以让 Swift 按字母顺序对数组的项目进行排序:

print(toys.sorted())

最后,如果您想删除一个项目,请使用remove()如下方法:

toys.remove(at: 0)

数组具有更多属性和方法 - 尝试输入toys.以调出 Xcode 的代码完成选项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Java23种设计模式之结构型模式的几种使用场景

前言 这是设计模式的第二期;继续根据实际开发应用场景解析这几种结构型设计模式. 1.适配器模式(Adapter) 概念: 它允许两个不兼容的接口通过适配器类工作在一起。这种模式通常用于将已存在的类(被称为适配者)的接口转换成客户端…

升级指南:探索CMMI2.0与3.0之间的企业变革!

CMMI2.0和CMMI3.0对企业的要求在某些方面有所变化,主要体现在以下几个方面: CMMI2.0对企业的要求 1.人员要求: 硬性要求:确保企业有25名以上的技术人员和10名以上的支持人员。 设立专门的人员对接CMMI评估,负责体系…

SpringMVC系列七: 手动实现SpringMVC底层机制-上

手动实现SpringMVC底层机制 博客的技术栈分析 🛠️具体实现细节总结 🐟准备工作🍍搭建SpringMVC底层机制开发环境 实现任务阶段一🍍开发ZzwDispatcherServlet🥦说明: 编写ZzwDispatcherServlet充当原生的DispatcherSer…

码云建仓库

1.新建仓库 码云地址 打开 码云地址 ,点击“”,新建仓库,添加仓库内容 ,创建。 小提示:如果本地已有项目,就不要选初始化,设置模板,容易冲突。 2. 进入当前仓库页 小提示&#x…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的巡演(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

心明眼亮 洞悉万物

如何洞悉事物的本质呢? 阳明先生:世间之事,纷繁复杂,不可能一一研究得过来。 圣人只需要把内心的明镜擦亮,而无需担心外部的事事物物在镜子中如何映照。 —— 外界事物是无穷无尽的,永远探究不完&#xf…

30 - 每位经理的下属员工数量(高频 SQL 50 题基础版)

30 - 每位经理的下属员工数量 -- 根据reports_to ,获取employee_id,即分组用e1.reports_to,查询用e2.employee_id,e2.nameselect e2.employee_id,e2.name ,count(e1.reports_to) reports_count,round(avg(e1.age),0) average_age from Employees e1 left…

【鸿蒙踩坑记录】解决:list组件滑动至左边或右边,回弹效果过大问题

一、问题描述 开发过程中使用List组件,当内容超过一屏时可出现滚动效果,此时按住内容迅速滑动至左边,或者滑动到右边,回弹效果过大 期望:滑动时,不要有那么大的回弹效果 二、目前效果 三、解决方法 3.1…

go语言day03

目录 一、 go语言的数据类型: 二、声明赋值的简写形式: ":" 1)重复使用的编译错误 2)在全局变量中使用 : 会报编译错误 三、变量规则: 0)变量的命名规则: 1)创建的局部…

丰臣秀吉-读书笔记六

登山的目标必然是山顶。但人生的乐趣和生息的快乐却不在山顶,相反可以说是在山中的逆境之处。当我们遇上峡谷、绝壁、溪流、断崖、雪崩之类的险路时,心里虽想着已经不行了等,却不甘就此罢手而不与面前的艰难险阻战斗。而当我们完美克服并跨越…

代码随想三刷二叉树篇4

代码随想三刷二叉树篇4 617. 合并二叉树题目代码 700. 二叉搜索树中的搜索题目代码 98. 验证二叉搜索树题目代码 530. 二叉搜索树的最小绝对差题目代码 501. 二叉搜索树中的众数题目代码 236. 二叉树的最近公共祖先题目代码 617. 合并二叉树 题目 链接 代码 /*** Definitio…

.NET 上位机通讯 NModbus4 的使用教程

使用nuget引入NModbus4 RTU 示例 1,串口通信示例 // // RTU SerialPort serialPort new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);serialPort.Open();ModbusMaster master ModbusSerialMaster.CreateRtu(serialPort);// 起始地址 “…

用 Rust 实现一个替代 WebSocket 的协议

很久之前我就对websocket颇有微词,它的确满足了很多情境下的需求,但是仍然有不少问题。对我来说,最大的一个问题是websocket的数据是明文传输的,这使得websocket的数据很容易遭到劫持和攻击。同时,WebSocket继承自HTTP…

Spark SQL 血缘解析方案

背景 项目背景建设数据中台,往往数据开发人员首先需要能够通过有效的途径检索到所需要的数据,然后根据检索的数据模型进行业务加工然后得到一些中间模型,最后再通过数据抽取工具或者OLAP分析工具直接将数据仓库中加工好的公共模型输出到应用层。这里我不在去介绍数据仓库为…

Mysql8死锁排查

Mysql8死锁排查 Mysql8 查询死锁的表 -- 查询死锁表select * from performance_schema.data_locks;-- 查询死锁等待时间select * from performance_schema.data_lock_waits;Mysql8之前的版本 查询死锁的表 -- 查询死锁表SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;-- 查询…

QT QML 界面设计教程8——图标(图片)标签样式

MyIconLabel.qml import QtQuick 2.14 //Item可以替换为Rectangle以设置背景色 Item{id: controlproperty alias source: _icon.sourceproperty alias imageWidth: _icon.widthproperty alias imageHeight:_icon.heightproperty alias text: _text.textproperty alias color: …

mysql 字符串字段判断是否包含某个字符串的方法

在MySQL中,判断一个字符串字段是否包含特定子字符串,可以采用以下几种方法: 1. 使用 LIKE 操作符 这是最常见的方法,适用于简单的模糊匹配。 SELECT * FROM table_name WHERE column_name LIKE %substring%; 这里的 % 是通配符&…

Virtualbox主机和虚拟机之间文件夹共享及双向拷贝

在VirtualBox这样的虚拟化环境中,实现主机与虚拟机之间的文件夹共享与双向文件传输是一个常见的需求。下面,我们将详细讲解如何在VirtualBox中实现这一功能。 一、安装与准备 首先,确保你已经安装了VirtualBox,并在其上成功创建…

最大乘积和-第13届蓝桥杯省赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第85讲。 最大乘积和&#…

2024年码蹄杯本科院校赛道初赛(省赛)

赛时所写题&#xff0c;简单写一下思路&#xff0c;qwq 第一题&#xff1a; 输出严格次小值&#xff0c; //#pragma GCC optimize(2)#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> #incl…