百日学 Swift(Day 8) – structs, properties, and methods(结构体 第 1 部分:结构体,属性和方法)
1. Creating your own structs(创建自定义结构体) – test
关键字:struct,内部的变量称为 属性 property
struct Sport { // 声明结构体
var name: String // 存储属性
}
var tennis = Sport(name: "田径") // 实例化
print(tennis.name) // 使用属性
tennis.name = "马拉松" // 修改属性
2. Computed properties(计算属性) – test
struct Sport {
var name: String // 存储属性
var isOlympicSport: Bool // 存储属性
var olympicStatus: String { // 计算属性
if isOlympicSport {
return "\(name) 是奥运会项目"
} else {
return "\(name) 是非奥运会项目"
}
}
}
let chessBoxing = Sport(name: "国际象棋", isOlympicSport: false) //实例化
print(chessBoxing.olympicStatus) // 使用计算属性
3. Property observers(属性观察器) – test
属性观察器,可以在任何属性更改之前或之后运行代码。为了说明这一点,我们将编写一个Progress
跟踪任务和完成百分比的结构:
struct Progress {
var task: String
var amount: Int
}
现在,我们可以创建该结构的实例并随时间调整其进度:
var progress = Progress(task: "已下载 ", amount: 0)
progress.amount = 30
progress.amount = 80
progress.amount = 100
我们想要发生的是Swift每次amount
更改都会打印一条消息,我们可以使用didSet
属性观察器。每次amount
更改时,它将运行一些代码:
struct Progress {
var task: String
var amount: Int {
didSet {
print("\(task):\(amount)%")
}
}
}
您还可以willSet
用来在属性更改之前采取措施,但这很少使用。
4. Methods(方法) – test
结构体内部可以具有函数,并且这些函数可以根据需要使用结构的属性。结构内部的函数称为方法,但它们仍使用和函数相同的func
关键字。
我们可以用一个City
结构来证明这一点。其中有一个population
存储城市人口的属性,以及一个collectTaxes()
返回人口乘以1000的方法。由于该方法属于该方法,City
因此可以读取当前城市的population
属性。
这是代码:
struct City {
var population: Int
func collectTaxes() -> Int {
return population * 1000
}
}
该方法属于该结构,因此我们在该结构的实例上调用它,如下所示:
let london = City(population: 9_000_000)
london.collectTaxes()
5. Mutating methods(可变方法) – test
当需要在方法内部更改属性时,可以使用mutating
关键字对其进行标记,使之成为可变方法,如下所示:
struct Person {
var name: String
mutating func makeAnonymous() { // 改变属性的可变方法
name = "无名氏"
}
}
因为它更改了属性,所以 Swift 仅允许在Person
的实例上调用可变方法:
var person = Person(name: "Ed")
person.makeAnonymous()
6. Properties and methods of strings(字符串的属性和方法) – test
count
属性读取字符串中的字符数:
print(string.count) // 注意汉字字符和英文字符
hasPrefix()
方法,如果字符串以特定字母开头,则返回true:
print(string.hasPrefix("Do"))
- 通过调用字符串的
uppercased()
方法将其改为全部大写:
print(string.uppercased())
- 甚至可以让 Swift 将字符串的字母排序成一个数组:
print(string.sorted())
字符串具有更多的属性和方法——尝试键入string.
,通过 Xcode 的自动完成功能来查看其它的属性和方法。
7. Properties and methods of arrays(数组的属性和方法) – test
假设有这样的一个数组
var rankList = ["C","Swift","Object-C"]
- 可以使用
count
属性读取数组中的元素数:
print(rankList.count)
- 如果要添加新元素,使用
append()
方法:
rankList.append("Java")
- 可以使用
firstIndex()
方法在数组内找到任何项,如下所示:
rankList.firstIndex(of: "Swift")
这将返回1,因为数组从0开始计数。
- 就像使用字符串一样,可以让Swift将数组中的项目按字母顺序排序:
print(rankList.sorted())
- 最后,如果要删除项目,请使用如下
remove()
方法:
rankList.remove(at: 0)
数组还有很多的属性和方法——尝试键入rankList.
,通过 Xcode 的自动完成功能来查看其它的属性和方法。
注意:在操作的时候要避免数组越界