结构体
本课属于 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挑战
简单声明一个结构体 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)")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Swift 在线编辑器