싱글턴 패턴
Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 42번째.
디자인 패턴은 일반적인 디자인 문제에 대한 검증된 해결책입니다. 싱글턴 패턴은 클래스가 정확히 하나의 인스턴스만 가지며 어디서든 접근할 수 있도록 합니다. Swift에서는 인스턴스를 보유하는 static let과 다른 인스턴스를 생성할 수 없도록 하는 private init을 사용합니다:
final class Settings {
static let shared = Settings()
var theme = "light"
private init() {}
}
Settings.shared.theme = "dark"
print(Settings.shared.theme)출력:
darkSettings.shared를 사용하는 모든 경우는 동일한 객체를 참조하므로, 프로그램의 한 부분에서 변경한 내용이 모든 곳에서 보입니다. static let은 처음 사용할 때 지연 생성되며 여러 스레드가 동시에 시작하더라도 안전합니다:
final class Counter {
static let shared = Counter()
private(set) var hits = 0
private init() {}
func hit() { hits += 1 }
}
func pageA() { Counter.shared.hit() }
func pageB() { Counter.shared.hit(); Counter.shared.hit() }
pageA()
pageB()
print(Counter.shared.hits)
print(Counter.shared === Counter.shared)출력:
3
true초기화 프로그램이 private이므로 Settings()는 클래스 외부에서 컴파일되지 않으며, 이를 통해 "하나만"이라는 약속을 지킵니다:
// let other = Settings() // error: 'Settings' 이니셜라이저는 'private' 보호 수준으로 인해 접근할 수 없습니다싱글턴은 신중하게 사용하세요. 싱글턴은 전역 상태이므로 어떤 코드든 이를 변경할 수 있고, 테스트를 깨끗한 복사본에서 쉽게 시작할 수 없습니다. 로거 또는 앱의 구성처럼 프로그램마다 실제로 하나만 존재하는 것에 적합하지만, 객체를 매개변수로 전달하는 편이 더 명확한 경우가 많습니다.
// 테스트하기에 더 명확함: logger가 전달됨
func process(order: Order, log: Logger) { log.write("processing \(order.id)") }챌린지
쉬움싱글턴 Logger를 완성하세요. static let shared 인스턴스, 비공개 초기화 구문, entries의 private(set) 배열, 그리고 [INFO] message 또는 [ERROR] message를 저장하는 log(_:level:)이 있습니다(레벨은 info 또는 error입니다). errorCount는 계산된 속성입니다. 제공된 코드는 서로 다른 두 함수에서 Logger.shared를 호출하므로, 두 함수 모두 동일한 인스턴스에 접근해야 합니다.
제공된 코드는 info,message 또는 error,message 형식의 줄을 읽고, info 줄은 handleInfo를 통해, error 줄은 handleError를 통해 전달한 다음 모든 항목과 errors: 1을 출력합니다.
코드는 Logger.swift와 Functions.swift에 작성합니다. main.swift에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.
직접 해보기
// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: ",", maxSplits: 1).map(String.init)
if p[0] == "error" { handleError(p[1]) } else { handleInfo(p[1]) }
}
for e in Logger.shared.entries { print(e) }
print("errors: \(Logger.shared.errorCount)")
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Swift 플레이그라운드