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

相关推荐
孙克旭_3 分钟前
第一章 Sentinel
java·开发语言·sentinel
是乙太呀19 分钟前
php反序列化1_常见php序列化的CTF考题
开发语言·web安全·渗透测试·php·ctf·反序列化
WZF-Sang23 分钟前
Linux—进程概念学习-03
linux·运维·服务器·c语言·开发语言·学习·vim
蓝晶之心27 分钟前
JAVA之若依框架——达梦数据库
java·开发语言·数据库
凡人的AI工具箱33 分钟前
40分钟学 Go 语言高并发:【实战】并发安全的配置管理器
开发语言·网络·后端·安全·golang
martian66536 分钟前
C# 基于WPF实现数据记录导出excel
开发语言·c#·excel
littlegirll1 小时前
KADB支持arm架构Pro*c
c语言·开发语言·架构
小志biubiu1 小时前
【C++11】可变参数模板/新的类功能/lambda/包装器--C++
开发语言·c++·笔记·学习·c++11·c11
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之二)
开发语言·rust
WALL-EC2 小时前
VS2019+QT5.12 创建UI(Dialog窗体)界面自动生成.h和cpp文件
开发语言·qt·ui