百日学 Swift (Day 8) – 结构体 第 1 部分:结构体,属性和方法

百日学 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 的自动完成功能来查看其它的属性和方法。

注意:在操作的时候要避免数组越界

发布了51 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/hh680821/article/details/105172663