ํ๋กํผํฐ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ๊ณผ ๊ด๋ จ๋ ๊ฐ์ด๋ค. ํ๋กํผํฐ์ ์ข ๋ฅ๋ ๋ค์๊ณผ ๊ฐ๋ค.
let ํน์ var๋ก ์ ์ธํ๋ค.
struct FixedLengthRange {
var firstValue: Int
let length: Int
}
var rangeOfThree = FixedLengthRange(firstValue: 0, length: 3)
rangeOfThree.firstValue = 6
rangeOfThree.length = 4 // error
์์ ์์ ์์ rangeOfThree๋ var๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ๋ฐ๋ฉด ๊ตฌ์กฐ์ฒด๊ฐ ์๋๋ผ ํด๋์ค๋ let์ผ๋ก ์ ์ธํ๋๋ผ๋ ์ฐธ์กฐ ํ์ ์ด๊ธฐ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
class FixedLengthRange {
var firstValue = 0
var length = 3
}
let rangeOfFour = FixedLengthRange()
rangeOfFour.length = 4
print(rangeOfFour.length) // 4
๊ฐ์ด ์ฒ์ ์ฌ์ฉ๋ ๋ ๊ณ์ฐ๋๋ ํ๋กํผํฐ์ด๋ค. ๋ฐ๋์ var๋ก ์ ์ธํด์ผ ํ๋ค. ํน์ ์์์ ์์กด์ ์ด๊ฑฐ๋ ๊ณ์ฐ์ด ๋ณต์กํ ๊ฒฝ์ฐ lazy๋ก ์ ์ธํ๋ค.
class DataImporter {
// ์ธ๋ถ ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํด๋์ค๋ก ๊ฐ์ ํ๋ค.
var filename = "data.txt"
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("More data")
์ฐ์ฐ ํ๋กํผํฐ๋ getter์ setter๋ฅผ ์ด์ฉํด ๊ฐ์ ํ์ํ๊ณ ๊ฐ์ ์ ์ผ๋ก ๋ค๋ฅธ ํ๋กํผํฐ์ ๊ฐ์ ์ค์ ํ ์ ์๋ค.
์๋์ ์์ ๋ฅผ ๋ณด๋ฉด center๊ฐ ์ฐ์ฐ ํ๋กํผํฐ์ ํด๋นํ๋ค. center๋ origin๊ณผ size์ ๊ฐ์ ์ฐ์ฐํ ํ ๋์จ ๊ฒฐ๊ณผ๊ฐ์ด๋ค. setter๋ฅผ ์ด์ฉํด center๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด origin๊ฐ์ ์ค์ ํ ์ ์๋ค. newCenter๋ผ๊ณ ์ธ์ ์ด๋ฆ์ ์ง์ ํ์ง ์์๋ newValue๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
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
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// square.origin is now at (10.0, 10.0)
square.origin = Point(x: 0.0, y: 0.0)
print("square.center is now at (\(square.center.x), \(square.center.y))")
// square.center is now at (5.0, 5.0)
getter๋ง ์๊ณ setter๋ฅผ ์ ๊ณตํ์ง ์๋ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์๋ฏธํ๋ค. ์ฝ๊ธฐ์ ์ฉ ๋ฟ ์๋๋ผ ๋ชจ๋ ์ฐ์ฐ ํ๋กํผํฐ๋ var๋ก ์ ์ธํ๋ค.
ํ๋กํผํฐ ์ต์ ๋ฒ๋ ๋ง ๊ทธ๋๋ก ํ๋กํผํฐ๋ฅผ ๊ด์ฐฐํ๋ค. ์ ๊ฐ์ด ์ค์ (set)๋๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ค. ์ด ์ต์ ๋ฒ๋ ์ง์ฐ ์ ์ฅ ํ๋กํผํฐ์์๋ ์ฌ์ฉํ ์ ์๋ค.
class StepCounter {
var totalSteps: Int = 0 {
willSet {
print("\(totalSteps) -> \(newValue)")
}
didSet {
print("\(oldValue) -> \(totalSteps)")
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 100
// 0 -> 100
// 0 -> 100
stepCounter.totalSteps = 300
// 100 -> 300
// 100 -> 300
https://jusung.gitbook.io/the-swift-language-guide/language-guide/10-properties