Menu
CoddyTech

Struct

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

Một struct nhóm dữ liệu và phương thức như một lớp (class). Swift tự viết hàm khởi tạo theo thành viên cho mọi struct, với một tham số cho mỗi thuộc tính, vì vậy struct không cần có init riêng:

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())

Đầu ra:

3
7

Có thể bỏ qua các thuộc tính có giá trị mặc định trong hàm khởi tạo thành viên:

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

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

Đầu ra:

1
false

Một cấu trúc được lưu trong hằng số let không thể thay đổi chút nào, kể cả các thuộc tính var của nó. Hãy lưu cấu trúc đó trong var để thay đổi:

let fixed = Point(x: 1, y: 2)
// fixed.x = 5    // lỗi: không thể gán vì fixed là hằng số let

var moving = Point(x: 1, y: 2)
moving.x = 5       // hợp lệ

Nhiều kiểu dữ liệu có sẵn của Swift là cấu trúc: Int, Double, String, Array và Dictionary. Cấu trúc bạn tạo hoạt động giống như các kiểu dữ liệu đó: chúng là những giá trị đơn thuần.

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())

Đầu ra:

12.50
3.05
challenge icon

Thử thách

Dễ

Khai báo một struct Item với các thuộc tính name (String), price (Int, tính bằng xu) và quantity (Int). Thêm phương thức total() trả về tích của giá và số lượng, cùng phương thức line() trả về 2 x tea = 350.

Code được cung cấp đọc một mặt hàng trên mỗi dòng theo định dạng name,price,quantity, tạo từng Item bằng hàm khởi tạo thành viên và in ra line(). Sau đó, code in ra sum: cùng tổng của tất cả các giá trị tổng.

Code của bạn nằm trong Item.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 cung cấp: giữ nguyên
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 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