Menu
CoddyTech

结构体

本课属于 Coddy Swift 学习旅程的“面向对象编程”单元。第 7 课,共 57 课。

struct 会像类一样组合数据和方法。Swift 会为每个结构体编写一个成员初始化器,每个属性对应一个参数,因此结构体不需要自己的 init:

struct Point {
    var x: Int
    var y: Int

    func distanceFromOrigin() -> Int {
        abs(x) + abs(y)
    }
}

let p = Point(x: 3, y: -4)
print(p.x)
print(p.distanceFromOrigin())

输出:

3
7

具有默认值的属性可以在成员逐一初始化器中省略:

struct Settings {
    var volume = 5
    var muted = false
}

let quiet = Settings(volume: 1)
print(quiet.volume)
print(quiet.muted)

输出:

1
false

存储在 let 常量中的结构体完全不能更改,连它的 var 属性也不能更改。要修改它,请将它存储在 var 中:

let fixed = Point(x: 1, y: 2)
// fixed.x = 5    // 错误:无法赋值,fixed 是 let 常量

var moving = Point(x: 1, y: 2)
moving.x = 5       // 没问题

Swift 自带的许多类型都是结构体:Int、Double、String、Array 和 Dictionary。你的结构体与这些类型的行为相同:它们都是普通值。

struct Money {
    var cents: Int
    func formatted() -> String {
        "\(cents / 100).\(cents % 100 < 10 ? "0" : "")\(cents % 100)"
    }
}

print(Money(cents: 1250).formatted())
print(Money(cents: 305).formatted())

输出:

12.50
3.05
challenge icon

挑战

简单

声明一个结构体 Item,包含属性 name(String)、price(Int,以分为单位)和 quantity(Int)。添加一个方法 total(),返回 price 乘以 quantity 的结果;再添加一个方法 line(),返回 2 x tea = 350。

提供的代码会按行读取每个商品,格式为 name,price,quantity,使用成员逐一初始化器创建每个 Item,并打印 line()。然后打印 sum: 和所有总价之和。

你的代码写在 Item.swift 中。main.swift 包含提供的输入/输出代码,不能编辑。

亲手试试

// 提供的输入和输出代码:保持原样。
var input: [String] = []
while let line = readLine() { input.append(line) }
var sum = 0
for row in input {
    let p = row.split(separator: ",").map(String.init)
    let item = Item(name: p[0], price: Int(p[1])!, quantity: Int(p[2])!)
    print(item.line())
    sum += item.total()
}
print("sum: \(sum)")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Swift 在线编辑器