Menu
CoddyTech

Ngữ nghĩa giá trị

Thuộc phần Lập trình hướng đối tượng trong hành trình Swift của Coddy. Bài học 8 trên 57.

Struct là kiểu giá trị: khi gán một struct cho biến khác, bạn sẽ sao chép nó. Thay đổi bản sao không làm thay đổi bản gốc, khác với lớp:

struct Point {
    var x: Int
}

var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)

Đầu ra:

1
99

Phép so sánh tương tự với một lớp cho thấy sự khác biệt: cả hai biến cùng tham chiếu đến một đối tượng.

class PointRef {
    var x: Int
    init(x: Int) { self.x = x }
}

let a = PointRef(x: 1)
let b = a
b.x = 99
print(a.x)

Đầu ra:

99

Truyền một struct vào hàm cũng truyền một bản sao. Tham số là hằng số, nên để trả về phiên bản đã thay đổi, hàm tạo một bản sao cục bộ rồi trả về bản sao đó:

struct Point {
    var x: Int
}

func shifted(_ p: Point, by dx: Int) -> Point {
    var copy = p
    copy.x += dx
    return copy
}

let start = Point(x: 1)
let moved = shifted(start, by: 4)
print(start.x)
print(moved.x)

Đầu ra:

1
5

Mảng các cấu trúc lưu giữ những giá trị độc lập. Thay đổi một phần tử thông qua chỉ số của nó chỉ làm thay đổi phần tử đó, còn sao chép mảng sẽ sao chép mọi giá trị:

struct Score {
    var points: Int
}

var round1 = [Score(points: 1), Score(points: 2)]
var round2 = round1
round2[0].points = 50
print(round1[0].points)
print(round2[0].points)

Đầu ra:

1
50
challenge icon

Thử thách

Dễ

Hoàn thành tryDiscount(_:percent:). Hàm nhận một cấu trúc Price và trả về một bản sao đã giảm giá: số xu được giảm theo phần trăm, làm tròn xuống. Code được cung cấp in ra giá gốc và giá đã giảm, vì vậy giá gốc phải được giữ nguyên.

Code được cung cấp đọc giá tính bằng xu và một tỷ lệ phần trăm trên mỗi dòng, rồi in ra was 1000, now 900 cho mỗi dòng.

Code của bạn nằm trong Price.swift và Functions.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.

Tự làm thử

// Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
let original = Price(cents: Int(input[0])!)
for line in input.dropFirst() {
    let cheaper = tryDiscount(original, percent: Int(line)!)
    print("was \(original.cents), now \(cheaper.cents)")
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Playground Swift