Properties
ν΄λμ€λ ꡬ쑰체, μ΄κ±°μ²΄μ κ°μ²΄ μΈμ€ν΄μ€κ° κ·Έ λ΄λΆμ κ°μ§κ³ μλ κ°μ²΄μ μνμ κ΄ν μ 보λ₯Ό λ§νλ€.
- μ μ₯ νλ‘νΌν°: μΈμ€ν΄μ€μ μΌλΆλ‘ μμμ λ³μ κ°μ μ μ₯
- κ³μ° νλ‘νΌν°: κ°μ μ μ₯νλ λμ μ κ³μ°μ ν¨( ν΄λμ€, ꡬ쑰체, μ΄κ±°νμμ μ 곡)
- νμ νλ‘νΌν°: νλ‘νΌν°λ νμ κ·Έ μ체μ μ°κ²°λμ΄ μμ μ μλλ°, μ΄λ₯Ό νμ νλ‘νΌν°λΌκ³ ν¨
μ μ₯ νλ‘νΌν° (Stored Properties)
μ μ₯ νλ‘νΌν°λ νΉμ ν΄λμ€ λλ ꡬ쑰체μ μΈμ€ν΄μ€ μΌλΆλ‘μ μ μ₯λ μμ λλ λ³μμ΄λ€. λν μ μ₯ νλ‘νΌν°λ₯Ό μ μΈν λ “κΈ°λ³Έκ° (Default Property Value)”λ₯Ό μ€μ ν μ μλ€. κ·Έλ¦¬κ³ μ΄λ¬ν μ μ₯ νλ‘νΌν°λ initializer(μμ±μ)λ‘ μ΄κΈ°ν μν¬ μ λ μλ€. μμ±μμ μν΄ μ΄κΈ°ν λ λλ ν΄λΉ νλ‘νΌν°κ° μμλ‘ μ μΈ λμλ€κ³ ν΄λ μμ μ΄ κ°λ₯νλ€.
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// the range represents integer values 0, 1, and 2
rangeOfThreeItems.firstValue = 6
// the range now represents integer values 6, 7, and 8
μμλ‘ μ μλ ꡬ쑰체 μΈμ€ν΄μ€ (Stored Properties of Constant Structure Instances)
ꡬ쑰체μ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μμμ ν λΉνλ©΄ νλ‘νΌν°κ° λ³μλ‘ μ μΈλμ΄ μμ΄λ μΈμ€ν΄μ€μ νλ‘νΌν°λ₯Ό μμ ν μ μλ€.
let rangeOfFourItems = FixedLengthRange(firstValue : 0, length: 4)
// μ΄ λ²μλ μ μ κ° 0, 1, 2, 3 μ λνλ
rangeOfFourItems.firstValue = 6.
// μ΄λ firstValue κ° λ³μ μμ±μΌμ§λΌλ, μλ¬λ₯Ό λ°ν
μ΄λ¬ν λμμ κ΅¬μ‘°μ²΄κ° κ° νμ μ΄κΈ° λλ¬Έμ΄λ€. κ° νμ μ μΈμ€ν΄μ€κ° μμλ‘ μ μΈνλ©΄ μΈμ€ν΄μ€μ λͺ¨λ νλ‘νΌν°μ λν΄ μμ ν μ μμ΅λλ€.
νμ§λ§, μ°Έμ‘°νμ μΈ ν΄λμ€μμλ μ΄κ²κ³Ό λ€λ₯Έ κ²°κ³Όκ° λνλλ€. ν΄λμ€ μΈμ€ν΄μ€λ₯Ό μμλ‘ μ μΈν΄λ μ μΈν νλ‘νΌν°μ κ°μ λ³κ²½ν μ μλ€.
μ§μ° μ μ₯ νλ‘νΌν° (Lazy Stored Properties)
μ§μ° μ μ₯ νλ‘νΌν° (lazy stored property)λ μ²μ νΈμΆλ λκΉμ§ μ΄κΈ°κ°μ κ³μ°λμ§ μλ νλ‘νΌν° μ΄λ€. μ§μ° μ μ₯ νλ‘νΌν°λ μ μΈ μ μ lazy ν€μλλ₯Ό λΆμ¬ λνλΈλ€.
NOTEβοΈ
μΈμ€ν΄μ€ μ΄κΈ°νκ° μλ£λ νμλ μ΄κΈ°κ°μ΄ μμ μ μμΌλ―λ‘ μ§μ° νλ‘νΌν°λ var ν€μλλ₯Ό μ¬μ©νμ¬ λ³μλ‘ μ μΈν΄μΌ νλ€. νλ‘νΌν° μμλ μ΄κΈ°νκ° μλ£λκΈ° μ μ νμ κ°μ κ°μ§κ³ μμ΄μΌ νλ―λ‘ lazyλ‘ μ μΈν μ μλ€.
ν΄λΉ μμ±μ΄ λ°λμ μ²μλΆν° μ΄κΈ°νκ° νμνμ§ μμ κ²½μ°(μΌλ°μ μΌλ‘ λ§μ λ©λͺ¨λ¦¬ 곡κ°μ μ°¨μ§νλ μ΄λ―Έμ§ λ±)μ μ΄κΈ°νλ₯Ό μ§μ°μν¬ μ μλ€.
(λΆνμν μ±λ₯μ νλ, λ©λͺ¨λ¦¬ 곡κ°μ λλΉ μ€μΌ μ μμ)
κ³μ° νλ‘νΌν° (Computed Properties)
ν΄λμ€, ꡬ쑰체, μ΄κ±°νμ κ³μ°λ νλ‘νΌν°λ₯Ό μ μΈν μ μλ€. μ΄ μ°μ°νλ‘νΌν°λ μ€μ κ°μ μ μ₯νκ³ μλ κ²μ΄ μλλΌ, getterκ³Ό optionalν setterλ₯Ό μ κ³΅ν΄ κ°μ νμνκ³ κ°μ μ μΌλ‘ λ€λ₯Έ νλ‘νΌν° κ°μ μ€μ ν μ μλ λ°©λ²μ μ 곡νλ€. setterλ νμμ μΈ μμλ μλκ³ μ νμ¬νμ΄λ€.
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: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set(newCenter) {
origin.x = newCenter.x - (size.width / 2)
origin.y = newCenter.y - (size.height / 2)
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
// initialSquareCenter is at (5.0, 5.0)
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// Prints "square.origin is now at (10.0, 10.0)"
μ μ½λλ μ’νμν¬κΈ°λ₯Ό κ°λ μ¬κ°νμ νννλ ꡬ쑰체μ κ΄ν μ½λμ΄λ€. μ¬κΈ°μ Rect ꡬ쑰체λ μ¬κ°νμ μ€μ μ νννλ centerλΌλ μ°μ° νλ‘νΌν°λ₯Ό μ 곡νλ€. μ΄ νλ‘νΌν°λ κ³μ°λ νλ‘νΌν°μ μ μλλ‘ κ°μ μ§μ κ°κ³ μλ κ²μ΄ μλλΌ λ€λ₯Έ μ’νμ ν¬κΈ° νλ‘νΌν°λ€μ μ μ ν μ°μ°ν΄μ ꡬν μ μλ€. (get) λ setμΌλ‘ μ¬κ°νμ μ€μ μ μ§μ μ€μ ν μ μλλ°, μ΄ κ°μ μ€μ ν λ x, y μ’νκ° μ΄λ€ κ°μ κ°μ ΈμΌνλμ§ x, yμ μ μ ν μ’νκ°μ λ£μ΄μ€λ€.
square.center μ ν΅ν΄ square λ³μμ center νλ‘νΌν°μ μ κ·Όνλλ°, μ΄λ centerμ getterμ νΈμΆνμ¬ νμ¬ μμ±κ°μ κ°μ Έμ¨λ€. κΈ°μ‘΄ κ°μ λ°ννλ€κΈ° 보λ€λ, μ Pointλ₯Ό κ³μ°νμ¬ λ°νν΄μ€λ€. μμ½λμμ 보면, getterλ (5,5)λΌλ μ€μ¬μ μ λ°ννλ€.
κ·Έ λ€μ, center νλ‘νΌν°μ (15, 15)λΌλ μλ‘μ΄ κ°μ μ€μ νλ€. μ΄λ μ μ¬κ°νμ μ€λ₯Έμͺ½ μ, μλ κ·Έλ¦Όμμλ μ€λ μ§μ μ μ¬κ°νμ μμΉλ‘ μ΄λμν¨λ€. center νλ‘νΌν°λ₯Ό μ€μ νλ©΄ centerμ setterμ νΈμΆνλλ° μ΄λ orginμ΄λΌλ μ μ₯ νλ‘νΌν°μ xμ yκ°μ μμ νμ¬ μ μ¬κ°νμ μ μμΉλ‘ μ΄λμν¨λ€.
square λΌλ μλ‘μ΄ Rect λ³μλ₯Ό μμ±νλ€. squareλ³μλ (0,0) μ΄λΌλ μμ κ³Ό, (10, 10)μ΄λΌλ νκ³Ό λμ΄λ‘ μ΄κΈ°νλλ€. μλ κ·Έλ¦Όμ νλμ μ¬κ°νμ΄ μ΄ μ¬κ°νμ΄λ€.
Shorted Setter Declaration (Setter μ μΈμ κ°λ΅ν νν)
μμ μ½λμμλ Setterμ μΈμ μ΄λ¦μ μλμ κ°μ΄ set(newCenter)λΌκ³ λͺ μνμ§λ§, λ§μ½ μ΄λ κ² newCenterλΌκ³ μΈμ μ΄λ¦μ μ νμ§ μμΌλ©΄ μΈμ κΈ°λ³Έ μ΄λ¦μΈ newValueλ₯Ό μ¬μ©ν μ μλ€.
struct AlternativeRect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
μ μ½λμμλ set λ©μλ μμμ μΈμ μ΄λ¦μ μ§μ νμ§ μμλλ°λ newValue.x, newValue.yλ₯Ό μ¬μ©ν μ μλ κ²μ λ³΄μ€ μ μλ€.
Shorthand Getter Declaration
μ 체 getter λ³Έλ¬Έμ΄ λ¨μΌ ννμμ΄λ©΄, getterμ μμμ μΌλ‘ κ·Έ ννμμ λ°ννλ€.
struct CompactRect {
var origin = Point()
var size = Size()
var center: Point {
get {
Point(x: origin.x + (size.width / 2),
y: origin.y + (size.height / 2))
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
getterμμ returnμ μλ΅νλ€. μ΄λ ν¨μμμ returnμ μλ΅νλ κ²κ³Ό λμΌν κ·μΉμ κ°λλ€.
μ½κΈ°μ μ© κ³μ°λ νλ‘νΌν° (Read-Only Computed Properties)
getterλ§ μκ³ setterλ₯Ό μ 곡νμ§ μλ κ³μ°λ νλ‘νΌν°λ₯Ό μ½κΈ°μ μ© κ³μ°λ νλ‘νΌν°λΌκ³ νλ€. μ¦, μ½κΈ°μ μ© κ³μ°λ νλ‘νΌν°λ λ°λμ λ°ν κ°μ μ 곡νκ³ λ€λ₯Έ κ°μ μ§μ ν μλ μλ νλ‘νΌν°μ΄λ€.
NOTEβοΈ
μ½κΈ°μ μ© κ³μ°λ νλ‘νΌν°λ₯Ό ν¬ν¨ν΄ κ³μ°λ νλ‘νΌν°λ₯Ό μ μΈμμλ λ°λμ letμ΄ μλλΌ varλ‘ μ μΈν΄μΌνλ€. λ³΄ν΅ μ½κΈ°μ μ©(read-only)μ΄λΌ ν¨μ νλ² κ°μ΄ μ ν΄μ§λ©΄ λ³νμ§ μκΈ° λλ¬Έμ letμΌλ‘ μ μΈνλ κ²μ΄ λ§μΌλ κ³μ°λ νλ‘νΌν°λ μ½κΈ°μ μ©(read-only)μ΄λΌ νλλΌλ κ³μ° κ°μ λ°λΌ κ°μ΄ λ³ν μ μκΈ° λλ¬Έμ varλ‘ μ μΈνλ€.
νλ‘νΌν° κ΄μ°°μ(Property Observers)
μμ± κ΄μ°°μλ μμ± κ°μ΄ λ°λλ κ±Έ κ΄μ°°νμ¬ μλ΅ν©λλ€. μμ± κ΄μ°°μλ μμ± κ°μ μ€μ ν λλ§λ€(μ κ°μ΄ νμ¬ μμ± κ°κ³Ό κ°μλ) νΈμΆλ©λλ€.
- willSet : κ°μ΄ μ μ₯λκΈ° λ°λ‘ μ§μ μ νΈμΆ λ¨
- didSet : μ κ°μ΄ μ μ₯λκ³ λ μ§νμ νΈμΆ λ¨
willSetμμλ μ κ°μ νλΌλ―Έν°λͺ
μ μ§μ ν μ μλλ°, μ§μ νμ§ μμΌλ©΄ κΈ°λ³Έ κ°μΌλ‘ newValueλ₯Ό μ¬μ©ν©λλ€.
didSetμμλ λ°λκΈ° μ μ κ°μ νλΌλ―Έν°λͺ
μ μ§μ ν μ μλλ°, μ§μ νμ§ μμΌλ©΄ κΈ°λ³Έ κ°μΌλ‘ oldValueλ₯Ό μ¬μ©ν©λλ€.
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps