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

文章目录

创建自己的结构

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

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

swift 复制代码
struct Sport {
    var name: String
}

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

swift 复制代码
var tennis = Sport(name: "Tennis")
print(tennis.name)

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

swift 复制代码
tennis.name = "Lawn tennis"

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

计算属性

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

struct Sport {

var name: String

}

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

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

swift 复制代码
struct Sport {
    var name: String
    var isOlympicSport: Bool

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

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

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

swift 复制代码
let chessBoxing = Sport(name: "Chessboxing", isOlympicSport: false)
print(chessBoxing.olympicStatus)

属性观察者

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

swift 复制代码
struct Progress {
    var task: String
    var amount: Int
}

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

swift 复制代码
var progress = Progress(task: "Loading data", amount: 0)
progress.amount = 30
progress.amount = 80
progress.amount = 100

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

swift 复制代码
struct Progress {
    var task: String
    var amount: Int {
        didSet {
            print("\(task) is now \(amount)% complete")
        }
    }
}

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

方法

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

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

代码如下:

swift 复制代码
struct City {
    var population: Int

    func collectTaxes() -> Int {
        return population * 1000
    }
}

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

swift 复制代码
let london = City(population: 9_000_000)
london.collectTaxes()

变异方法

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

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

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

swift 复制代码
struct Person {
    var name: String

    mutating func makeAnonymous() {
        name = "Anonymous"
    }
}

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

swift 复制代码
var person = Person(name: "Ed")
person.makeAnonymous()

字符串的属性和方法

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

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

swift 复制代码
let string = "Do or do not, there is no try."

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

swift 复制代码
print(string.count)

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

swift 复制代码
print(string.hasPrefix("Do"))

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

swift 复制代码
print(string.uppercased())

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

swift 复制代码
print(string.sorted())

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

数组的属性和方法

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

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

swift 复制代码
var toys = ["Woody"]

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

swift 复制代码
print(toys.count)

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

swift 复制代码
toys.append("Buzz")

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

swift 复制代码
toys.firstIndex(of: "Buzz")

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

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

swift 复制代码
print(toys.sorted())

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

swift 复制代码
toys.remove(at: 0)

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

相关推荐
朝朝辞暮i1 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
小师兄吃牛肉2 小时前
C语言篇:宏
c语言·开发语言
郑同学的笔记3 小时前
【c++随笔28】strcmp 和 memcmp对比
开发语言·c++
言乐63 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
weixin_307779133 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
kakakahahahaha3 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i4 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
朝朝辞暮i4 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
笨笨饿4 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
YOLO数据集集合5 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化