因为断网又停了一天,等明天周六和周日各多补一节。

就像极富影响力的一本书《神话人月》(The Mythical Man-Month)的作者弗雷德·布鲁克斯(Fred Brooks)曾经说过的那样:“机智的程序员……通常可以通过将自己与代码分离开来,回馈并考虑数据来做到最好。表示是编程的本质。”

创建结构

结构让我们从几个小类型中创建自己的数据类型。例如,你可能将三个字符串和一个布尔值放在一起,并说它代表你的应用程序中的用户。

这些自定义类型(用户,游戏,文档等)构成了我们构建的软件的真正核心。如果你得到这些权则往往你的代码将随之而来。

结构使用struct来创建,例如我创建一个包含字符串的结构:

1
2
3
struct Zhhoo {
var url: String
}

类型创建完毕之后我们就可以调用它:

1
2
var adr = Zhhoo(url: "zhhooo.com")
print(adr.url)

当然,因为我们创建了变量adr,我们还可以通过点记法来修改它:

1
adr.url = "blog.zhhooo.com"

其他例子:

1
2
3
4
5
struct User {
var name = "Anonymous"
var age: Int
}
let twostraws = User(name: "Paul", age: 38)

计算属性(结构的返回值计算)

结构的参数可以是一个返回值构成的,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Zhhoo {
var url: String
var ssl: Bool
var head: String {
if ssl{
return "https://" + url
}else{
return "http://" + url
}
}
}

var adr = Zhhoo(url: "zhhooo.com/", ssl: true)
print(adr.head)

head的值会根据ssl的值的变化而变化。

注意:
1.计算属性必须要指定参数类型
2.常量不能作为计算属性

其他例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Wine {
var age: Int
var isVintage: Bool
var price: Int {
if isVintage {
return age + 20
} else {
return age + 5
}
}
}
let malbec = Wine(age: 2, isVintage: true)
print(malbec.price)

属性观察器

通过属性观察器你可以在结构中监听你的值,如果发生了改变则触发一些任务。有两种属性观察器,一个是didSet(在值改变后触发),一个是willSet(在值改变前触发)。例如:

1
2
3
4
struct Progress {
var task: String
var amount: Int
}

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

1
2
3
4
var progress = Progress(task: "Loading data", amount: 0)
progress.amount = 30
progress.amount = 80
progress.amount = 100

我们想让 Swift每次amount更改时都打印一条消息,我们可以使用didSet属性观察器。每次amount更改时,它将运行一些代码:

1
2
3
4
5
6
7
8
struct Progress {
var task: String
var amount: Int{
didSet {
print("Amount \(amount)%")
}
}
}

完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Progress {
var task: String
var amount: Int{
didSet {
print("Amount \(amount)%")
}
}
}

var progress = Progress(task: "Loading data", amount: 0)
progress.amount = 30
progress.amount = 80
progress.amount = 100

在结构中嵌入方法

我们可以直接在结构中嵌入函数,这样我们就可以通过点记法的方式对它进行调用,例如:

1
2
3
4
5
6
7
8
9
10
struct Zhhoo {
var url : String
func website(){
print("Let's go to the \(url) !")
}
}


var adr = Zhhoo(url: "zhhooo.com")
adr.website()

变异方法

在一般情况下,swift不允许嵌入的方法有修改结构内变量的代码。例如错误代码

1
2
3
4
5
6
struct Zhhoo {
var url : String
func website(){
url = "zhhooo.com"
}
}

如果想要方法内包含修改变量的代码,那么就需要用mutating进行标记,例如:

1
2
3
4
5
6
struct Zhhoo {
var url : String
mutating func website(){
url = "zhhooo.com"
}
}

因为更改了属性,所以Zhhoo只允许在作为变量的实例中调用该方法,而不能用常量。

1
var adr = Zhhoo(url: "zhhooo.com")

其他例子:

1
2
3
4
5
6
7
8
9
10
11
12
struct Book {
var totalPages: Int
var pagesLeftToRead = 0
mutating func read(pages: Int) {
if pages < pagesLeftToRead {
pagesLeftToRead -= pages
} else {
pagesLeftToRead = 0
print("I'm done!")
}
}
}

字符串的属性和方法

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

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

1
let string = "Do or do not, there is no try."

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

1
print(string.count)

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

1
print(string.hasPrefix("Do"))

你可以通过调用字符串的uppercased()方法将其大写:

1
print(string.uppercased())

你甚至可以让Swift将字符串的字母排序成一个数组:

1
print(string.sorted())

字符串具有更多的属性和方法-尝试键入string.以显示Xcode的代码完成选项。

数组的属性和方法

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

这是一个让我们开始的简单数组:

1
var toys = ["Woody"]

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

1
print(toys.count)

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

1
toys.append("Buzz")

你可以使用其firstIndex()方法在数组内找到任何项,如下所示:

1
toys.firstIndex(of: "Buzz")

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

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

1
print(toys.sorted())

最后,如果要删除项目,请使用如下remove()方法:

1
toys.remove(at: 0)

数组具有更多的属性和方法–尝试键入toys.以显示Xcode的代码完成选项。

参考资料

查看下一天的SwiftUI学习笔记

关于100days英文课程