계산 프로퍼티
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 12번째.
저장 프로퍼티는 값을 보유합니다. 계산 프로퍼티는 저장 공간이 없습니다. 읽을 때마다 코드를 실행하고 다른 프로퍼티에서 계산된 값을 반환합니다:
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)출력:
12.0
40.0값은 읽을 때마다 다시 계산되므로, 계산된 프로퍼티는 절대 최신 상태가 아닐 수 없습니다. 괄호 없이 저장된 프로퍼티처럼 읽습니다:
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)출력:
Ada Lovelace계산 프로퍼티에는 setter도 사용할 수 있습니다. set은 새 값을 newValue로 받아 이를 기반으로 하는 저장 프로퍼티를 업데이트합니다:
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)출력:
212.0
0.0다른 값들로부터 도출되며 계산 비용이 저렴한 값에는 계산된 프로퍼티를 사용하세요. 작업에 인수가 필요하거나 비용이 많이 드는 경우에는 메서드를 사용하세요:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // 프로퍼티: 인자 없음
func total(withTax rate: Int) -> Int { // 메서드: 인자를 받음
total + total * rate / 100
}
}챌린지
쉬움저장 프로퍼티 radius와 읽기 전용 계산 프로퍼티 세 개를 사용하여 구조체 Circle을 완성하세요: diameter(반지름의 두 배), area(Double.pi를 사용하는 π r²), 그리고 면적을 String(format: "%.2f", area)를 사용하여 소수점 둘째 자리까지 반올림한 r=2.0 d=4.0 a=12.57을 반환하는 label입니다.
제공된 코드는 줄마다 하나의 반지름을 읽고, Circle을 생성한 다음 label을 출력합니다. 그런 다음 마지막 원의 반지름을 두 배로 만들고 label을 다시 출력하므로, 값은 반지름을 따라 변경되어야 합니다.
코드는 Circle.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.
직접 해보기
import Foundation
// 제공된 입력/출력 코드: 그대로 유지하세요
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)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드