Published 2022-03-20

Structs - 结构体

创建结构体

struct Person {
    var name: String
    var age: Int
}

# 使用结构体
var person = Person(name: "John Appleseed", age: 42)
print(person.name) // Prints "John Appleseed"

# 更改结构体属性
person.age = 99

计算属性

Swift可以添加一个属性用来计算属性的值。

struct Person {
    var name: String
    var age: Int

    var ageInDogYears: Int {
        return age * 7
    }
}

let person = Person(name: "John Appleseed", age: 42)
person.ageInDogYears // Prints "294"

属性观察器

属性观察期允许在更改任何属性前后调用代码。

struct Progress {
    var task: String
    var amount: Int {
        didSet {
            print("\(task) is now \(amount)% complete")
        }
    }
}

Progress(task: "Loading data", amount: 0)

progress.amount = 30
progress.amount = 80
progress.amount = 100

如上代码在每次运行时都会打印出一条消息,每次设置新的值时都会打印出一条消息。

方法

结构体和类的方法和普通的函数完全一样。

struct Person {
    var name: String
    var age: Int

    func birthday() {
        return age + 1
    }
}

let person = Person(name: "John Appleseed", age: 42)
person.birthday() // Prints "43"

变异函数

如果结构体具有可变属性,但是结构体的实例是作为常量创建的,那么该属性不能更改。如果需要改变,应该使用mutating关键字。

struct Person {
    var name: String
    var age: Int

    mutating func birthday() {
        age += 1
    }
}
var person = Person(name: "John Appleseed", age: 42)
person.birthday() // Prints "43"

字符串的方法和属性

let str = "Hello, world"

str.count // Prints "12"
str.hasPrefix("Hello") // Prints "true"
str.uppercased() // Prints "HELLO, WORLD"
str.sorted() // Prints "H, E, L, L, O, , , W, , , o, r, l, d"
str.lowercased() // Prints "hello, world"

数组的方法和属性

var toys = ["Woody"]

toys.count // Prints "1"
toys.append("Buzz")
toys.firstIndex(of: "Buzz") // Prints "2"
toys.sorted() // Prints "[Buzz, Woody]"
toys.remove(at: 0)

initializers

initializers是一种特殊的方法,它提供了不同的方法创建结构。默认情况所有结构都有一个init方法,它会自动调用所有的属性的initializers

struct Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

var person = Person(name: "John Appleseed", age: 42)

关联当前实例

在结构方法里,使用self可以获取或给对应的属性赋值。类似于 js 的 this

struct Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    func birthday() {
        self.age += 1
    }
}

惰性属性

类似于 js 的lazyload,仅在需要的时候创建或引入。

struct FamilyTree{
  var name:String
  lazy var familyTree = FamilyTree()

  init(name: String){
    self.name = name
  }
}

var ed = Person(name:"Ed")

ed.familyTree

静态属性或方法

static 变量的声明用于在结构的所有实例间共享

struct Student {
    static var classSize = 0
    var name: String

    init(name: String) {
        self.name = name
        Student.classSize += 1
    }
}

Student.classSize

访问控制

struct Person {
    private var id: String
    public var num: Int

    init(id: String) {
        self.id = id
    }

    func identify() -> String {
        return "My social security number is \(id)"
    }
}

结构体总结