Menu
CoddyTech

Thuộc tính tính toán

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

Thuộc tính lưu trữ giữ một giá trị. Thuộc tính tính toán không lưu trữ giá trị: thuộc tính này chạy code mỗi khi được đọc và trả về một giá trị được tính từ các thuộc tính khác:

struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        width * height
    }
}

var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)

Đầu ra:

12.0
40.0

Vì giá trị được tính lại mỗi khi đọc, thuộc tính được tính toán luôn cập nhật. Bạn đọc thuộc tính này như thuộc tính được lưu trữ, không cần dấu ngoặc đơn:

struct Person {
    var first: String
    var last: String

    var fullName: String {
        "\(first) \(last)"
    }
}

var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)

Đầu ra:

Ada Lovelace

Một thuộc tính được tính toán cũng có thể có bộ gán giá trị. set nhận giá trị mới dưới dạng newValue và cập nhật các thuộc tính được lưu trữ mà nó dựa vào:

struct Temperature {
    var celsius: Double

    var fahrenheit: Double {
        get { celsius * 9 / 5 + 32 }
        set { celsius = (newValue - 32) * 5 / 9 }
    }
}

var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)

Đầu ra:

212.0
0.0

Dùng thuộc tính được tính toán (computed property) cho giá trị suy ra từ các giá trị khác và dễ tính. Dùng phương thức (method) khi cần truyền tham số hoặc việc tính toán tốn nhiều tài nguyên:

struct Order {
    var items: [Int]
    var total: Int { items.reduce(0, +) }           // thuộc tính: không có đối số
    func total(withTax rate: Int) -> Int {           // phương thức: nhận một đối số
        total + total * rate / 100
    }
}
challenge icon

Thử thách

Dễ

Hoàn thành cấu trúc Circle với thuộc tính lưu trữ radius và ba thuộc tính tính toán chỉ đọc: diameter (gấp đôi bán kính), area (π r², dùng Double.pi) và label, trả về r=2.0 d=4.0 a=12.57 với diện tích được làm tròn đến hai chữ số thập phân bằng String(format: "%.2f", area).

Code được cung cấp đọc một bán kính trên mỗi dòng, tạo một Circle và in ra label. Sau đó, code nhân đôi bán kính của hình tròn cuối cùng và in lại label, vì vậy các giá trị phải thay đổi theo bán kính.

Code của bạn nằm trong Circle.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ử

import Foundation

// Đoạn code đầu vào và đầu ra đã được cung cấp: giữ nguyên
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
    last = Circle(radius: Double(line)!)
    print(last.label)
}
last.radius *= 2
print(last.label)
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