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.0Vì 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 LovelaceMộ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.0Dù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
}
}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)
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ỉnh3Tìm hiểu sâu về thuộc tính
Thuộc tính tính toánQuan sát thuộc tínhThành viên tĩnhEnum với phương thứcÔn tập: Nhật ký nhiệt độTự luyện tập: Playground Swift