Menu
CoddyTech

Struct hay class

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 10 trên 57.

Nguyên tắc của Swift là bắt đầu với struct và chỉ chọn class khi bạn cần những gì chỉ class mới cung cấp. Struct đơn giản hơn: mỗi biến sở hữu giá trị riêng, vì vậy một thay đổi ở nơi này sẽ không bao giờ khiến code ở nơi khác hoạt động ngoài dự đoán.

struct Temperature {
    var celsius: Double
}

var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)

Đầu ra:

21.0

Chọn một lớp khi nhiều phần của chương trình cần dùng chung một đối tượng: chúng cần thấy cùng một trạng thái luôn thay đổi, chẳng hạn như một tài khoản ngân hàng được nhiều màn hình sử dụng. Lớp cũng hỗ trợ kế thừa, điều mà struct không có.

class SharedLog {
    var lines: [String] = []
}

let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)

Đầu ra:

2

Các cấu trúc có thể dùng == mà không cần viết thêm mã. Thêm Equatable vào phần khai báo, Swift sẽ so sánh từng thuộc tính; lớp thì so sánh danh tính bằng ===:

struct Point: Equatable {
    var x: Int
    var y: Int
}

print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))

Đầu ra:

true
false

Kiểm tra nhanh: nếu hai mục có cùng dữ liệu nên được xem là cùng một thứ, hãy dùng struct (một điểm, một mức giá, một ngày). Nếu một mục có định danh quan trọng ngay cả khi dữ liệu của nó giống với mục khác (một tài khoản người dùng, một tệp đang mở), hãy dùng lớp.

struct Money { var cents: Int }          // 500 cent vẫn là 500 cent
class UserAccount {                      // hai tài khoản có thể trùng tên
    let id: Int
    var name: String
    init(id: Int, name: String) { self.id = id; self.name = name }
}
challenge icon

Thử thách

Dễ

Point là một struct cần hỗ trợ phép so sánh bằng ==. Hãy thêm phần tuân thủ và hoàn thiện countDistinct(_:), hàm này trả về số điểm khác nhau trong danh sách (hai điểm được xem là giống nhau khi cả hai tọa độ đều trùng khớp).

Code được cung cấp đọc một điểm trên mỗi dòng theo định dạng x,y và in ra distinct: cùng với số lượng.

Đặt code của bạn trong Point.swift và Functions.swift. main.swift chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

// Đoạn code đầu vào/đầu ra đã cho: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
let points = input.map { line -> Point in
    let p = line.split(separator: ",").map { Int($0)! }
    return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
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