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
99Phé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:
99Truyề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
5Mả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
50Thử 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)")
}
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
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpPhương thức và selfHàm khởi tạoLớp là tham chiếuÔn tập: Thẻ thư viện2Struct và kiểu giá trị
StructNgữ nghĩa giá trịPhương thức thay đổiStruct hay classÔn tập: mặt hàng trong kho5Kế thừa
Lớp conGhi đè phương thứcHàm khởi tạo và superfinal và hệ phân cấpÔn tập: hệ phân cấp nhân viên8Các giao thức tiêu chuẩn
CustomStringConvertibleEquatableComparableHashableÔn tập: Sắp xếp tùy chỉnhTự luyện tập: Playground Swift