文章目录
创建自己的结构
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 的代码完成选项。