当前位置: 首页 > news >正文

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 的代码完成选项。

相关文章:

  • 生产管理系统看板,在自动化设备领域的创新应用
  • Vue3 - 在项目中使用vue-i18n不生效的问题
  • 江协科技51单片机学习- p11 静态数码管显示
  • DbConnectionStringParser
  • SpringBoot 快速入门(保姆级详细教程)
  • 迈巴赫S480升级增强现实AR抬头显示hud比普通抬头显示HUD更好用吗
  • 如何基于Redis实现分布式锁?
  • 物理层(二)
  • 华为HCIP Datacom H12-821 卷6
  • Chromium 开发指南2024 Mac篇-开始编译Chromium(五)
  • 【LinuxC语言】进程间的通信——管道
  • a multiple definition link error when using gcc10.3.1
  • 关于HTTP劫持,该如何理解、防范和应对
  • 『这世界上有无忧无虑的孩子,和永远焦虑的父母』
  • 使用ESP32和Flask框架实现温湿度数据监测系统
  • create-react-app项目添加less配置
  • ES学习笔记(12)--Symbol
  • GitUp, 你不可错过的秀外慧中的git工具
  • If…else
  • Invalidate和postInvalidate的区别
  • magento 货币换算
  • Object.assign方法不能实现深复制
  • python学习笔记 - ThreadLocal
  • SpringBoot几种定时任务的实现方式
  • vue-cli3搭建项目
  • Windows Containers 大冒险: 容器网络
  • 前端临床手札——文件上传
  • 如何设计一个比特币钱包服务
  • 线上 python http server profile 实践
  • No resource identifier found for attribute,RxJava之zip操作符
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 7行Python代码的人脸识别
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 计算机视觉入门
  • #14vue3生成表单并跳转到外部地址的方式
  • (04)odoo视图操作
  • (4)Elastix图像配准:3D图像
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Python第六天)文件处理
  • (rabbitmq的高级特性)消息可靠性
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (补充)IDEA项目结构
  • (二)Optional
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)SvelteKit教程:hello world
  • (转)大道至简,职场上做人做事做管理
  • .NET C# 使用 iText 生成PDF
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 依赖注入和配置系统
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net连接oracle数据库