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
是一种特殊的方法,它提供了不同的方法创建结构。默认情况所有结构都有一个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
private
私有属性和方法,只有在结构体内才能访问public
公共属性和方法,所有代码都可使用公共属性和方法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)"
}
}
mutating
.self
常量来引用方法内结构的当前实例。lazy
关键字告诉 Swift
仅在第一次使用时创建属性。static
您可以使用关键字在结构的所有实例之间共享属性和方法。