프로퍼티는 값을 특정 클래스, 구조체, 또는 열거형을 연결한다. 저장된 프로퍼티는 인스턴스의 일부로 상수와 변수값을 저장하고, 계산된 프로퍼티는 값을 저장하는 대신 계산한다. 계산된 프로퍼티는 클래스, 구조체, 열거형에서 제공되고, 저장된 프로퍼티는 클래스와 구조체에서만 제공된다. 또한 프로퍼티 는 타입 자체와도 연결될 수 있는데 이를 타입 프로퍼티라고 한다. 프로퍼티 관찰자(property observer)를 정의하여 값의 변경을 모니터링할 수 있고 이는 하위클래스가 상속하는 프로퍼티에 추가된다.
struct FixedLengthRange {
var firstValue : Int
var length : Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue : 0, length : 3)
rangeOIfThreeITems.firstValue = 6
//다음과 같이 값의 수정, 저장이 모두 가능하다.
let rangeOfOthers = FixedLengthRange(firstValue : 0, length : 2)
rangeOfOthers.firstValue = 1
//상수이므로 값이 변하지 않고 에러가 난다.
//구조체는 값 타입이므로 인스턴스가 상수로 선언하면 수정이 불가하다.
//클래스는 참조 타입이므로 인스턴스를 상수로 할당해도 수정이 가능하다.
class DataImporter {
var filename = "data.text"
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}
let manager = DataManager()
manager.data.append("some Data")
manager.data.append("some more Data")
print(manager.importer.filename)
//"data.text"를 출력하게 된다.
//위에서 lazy가 붙어 있으므로 importer 프로퍼티의 인스턴스는
//filename 프로퍼티를 조회할 때 처음 접근 시 생성된다.
struct Point {
var x = 0.0, y = 0.0
}
// 점 구조체 정의하고 초기값을 설정함.
struct Size {
var width = 0.0, height = 0.0
}
//사이즈 구조체 정의하고 초기값을 설정함.
struct Rect {
var origin = Point()
var size = Size()
var center : Rect {
get {
let center X = origin.x + (size.width / 2)
let center Y = origin.y + (size.height / 2)
return Point(x : centerX, y : centerY)
} set(newCenter) {
let center X = newCenter.x + (size.width / 2)
let center Y = newCenter.y + (size.height / 2)
}
}
}
//Rect 구조체는 center라는 계산된 프로퍼티를 제공하는데 이를 위한 getter와 setter를 정의하게 된다.
var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(Width : 0.0, height : 0.0))
let initialSuqreCenter = square.center
square.center = Point(x : 15.0, y : 15.0)
print("Square.origin is now at\(square.origin.x), \(square.origin.y)")
struct Rect {
var origin = Point()
var size = Size()
var center : Rect {
get {
let center X = origin.x + (size.width / 2)
let center Y = origin.y + (size.height / 2)
//다음과 같이 return해주지 않아도 암시적 반환을 통해 작동한다.
} set {
let center X = newValue.x + (size.width / 2)
let center Y = newValue.y + (size.height / 2)
}
}
}
//다음과 같이 위 예시에서 사용한 newCenter를 쓰지 않고, newValue프로퍼티를 사용하게 된다.
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume : Double {
return width * height * depth
}
}
//get 키워드와 그것의 중괄호를 삭제하고 간편히 선언이 가능하다.
let fourByFiveByTwo = Cuboid(width : 4.0, height : 5.0, depth : 2.0)
print(ForByFivebyTwo)
//다음과 같은경우 40을 출력한다.