μ±κΈν΄ ν¨ν΄
μ±κΈν΄ ν¨ν΄μ μννΈμ¨μ΄ λμμΈ ν¨ν΄ μ€ νλλ‘, λ¨ νλμ μΈμ€ν΄μ€λ§μ μ¬μ©νλ λ°©μμ λλ€.
λ°λΌμ ν λ² μμ±λλ©΄ κ·Έ λ©λͺ¨λ¦¬ 곡κ°λ§ κ³μ μ¬μ©νλ―λ‘ λ©λͺ¨λ¦¬ λλΉλ₯Ό λ°©μ§ν μ μκ³ , μ¬μ© μ μ΄λ―Έ μμ±λμ΄ μλ μΈμ€ν΄μ€ μ¬μ©νλ κ²μ΄κΈ° λλ¬Έμ μλλ λΉ λ¦ λλ€.
νμ§λ§ μ μμ μΌλ‘ μμ±λμ΄ λ§μ κ³³μμ μ¬μ©λλ―λ‘ μ¬λ¬ μΈμ€ν΄μ€κ° μμ±λλ λ±μ λ©ν°μ€λ λ© νκ²½μμ λμμ± λ¬Έμ κ° λ°μν μ μμ΅λλ€. λ€νν swiftμμλ μ΄κΈ°ν μμ μ 미룬(lazily) static νλ‘νΌν°λ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό thread-safetyνκ² μ¬μ©ν μ μμ΅λλ€.
The free function dispatch_once is no longer available in Swift. In Swift, you can use lazily initialized globals or static properties and get the same thread-safety and called-once guarantees as dispatch_once provided.
κ·ΈλΌμλ μ±κΈν΄ ν¨ν΄ μ¬μ©μ μ μ€ν΄μΌν©λλ€. μμ‘΄ κ΄κ³μ ꡬ체νλ ν΄λμ€μ μμ‘΄νκ² λλ―λ‘, κ°μ²΄ μ§ν₯ μ€κ³ μμΉμ μλ°λκ² λ©λλ€.
κ°μ²΄ μ§ν₯ μ€κ³ μμΉμ μμ§ κ³΅λΆκ° νμν λΆλΆμ΄κΈ° λλ¬Έμ μ¬κΈ°κΉμ§λ§ μ 리νκ² μ΅λλ€.
μ±κΈν΄ ν¨ν΄ μ¬μ© μμ
iOSμμλ λ€μν κ³³μμ μ±κΈν΄ ν¨ν΄μ΄ μ¬μ©λκ³ μμΌλ©° μ¬μ©λ²μΌλ‘ κΆμ₯νκΈ°λ ν©λλ€. μλ₯Ό λ€μ΄ CoreDataλ₯Ό μ¬μ© μ μ±κΈν΄ ν¨ν΄μΌλ‘ CoreDataStackμ μμ±νμ¬ μ± μ μμμ CoreDataμ ν΅ν΄ λ°μ΄ν°λ₯Ό μ¬μ©νλλ‘ μ μνκ³ μμ΅λλ€.
// Define an observable class to encapsulate all Core Data-related functionality.
class CoreDataStack: ObservableObject {
static let shared = CoreDataStack() // βοΈ
// Create a persistent container as a lazy variable to defer instantiation until its first use.
lazy var persistentContainer: NSPersistentContainer = {
// Pass the data model filename to the container’s initializer.
let container = NSPersistentContainer(name: "DataModel")
// Load any persistent stores, which creates a store if none exists.
container.loadPersistentStores { _, error in
if let error {
// Handle the error appropriately. However, it's useful to use
// `fatalError(_:file:line:)` during development.
fatalError("Failed to load persistent stores: \(error.localizedDescription)")
}
}
return container
}()
private init() { }
}
Setting up a Core Data stack | Apple Developer Documentation
Set up the classes that manage and persist your app’s objects.
developer.apple.com
Class Singleton π Struct Singleton
μ Appleμ μμ μ½λμμλ μ μ μλ―μ΄, μ±κΈν΄ ν¨ν΄μ ν΄λμ€λ₯Ό ν΅ν΄ ꡬνν μ μμ΅λλ€. κ·ΈλμΌ λ¨ νλμ μΈμ€ν΄μ€λ‘ μ± μ μμμ μ¬μ©ν μ μμ΅λλ€.
ν΄λμ€μ ꡬ쑰체μ μ°¨μ΄μ μΌλ‘, κ°λ¨νκ² μ°Έμ‘° νμ κ³Ό κ° νμ μ λ€ μ μμ΅λλ€. μ±κΈν΄ ν¨ν΄μ ν΄λμ€κ° μ¬μ©λλ μ΄μ λ μ΄ μ°¨μ΄μ μμ μμλΌ μ μμ΅λλ€.
ν΄λμ€μ κ²½μ°, μΈμ€ν΄μ€ μμ± μ ν μμμ λ©λͺ¨λ¦¬κ° ν λΉλμ΄ λ³μ/μμκ° μ΄ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€λ λ°©μμ λλ€. λ°λΌμ A μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€λ `shared` λ³μκ° `a` λ³μμ μμ μ ν λΉνλ©΄, μμ μ΄ κ°μ§κ³ μλ μΈμ€ν΄μ€μ μ£Όμ κ°μ μ λ¬νκ² λλ©° `shared` μ `a` λ³μ λͺ¨λ κ°μ A μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€κ² λ©λλ€.
μ΄μ λ°λλ‘ κ΅¬μ‘°μ²΄μ κ²½μ°, μΈμ€ν΄μ€ μμ± μ μ€ν μμμ λ©λͺ¨λ¦¬κ° ν λΉλμ΄ λ³μ/μμκ° μΈμ€ν΄μ€λ₯Ό κ°μ§κ³ μλ λ°©μμ λλ€. λ°λΌμ B-0 μΈμ€ν΄μ€λ₯Ό κ°μ§ `shared` λ³μκ° `b` λ³μμ μμ μ ν λΉνλ©΄ μλ‘μ΄ B-1 μΈμ€ν΄μ€ ν λΉλκ² λ©λλ€. λ°λΌμ κ°κΈ° λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό κ°κ² λμ΄ λμΌν μΈμ€ν΄μ€λ₯Ό μ¬μ©ν΄ μ± μ μμμ 곡μ λ° μ¬μ© νκ³ μ νλ μ±κΈν΄ ν¨ν΄μ λͺ©μ μ μ΄λ£¨μ§ λͺ»νκ² λ©λλ€.
/*
ν΄λμ€λ₯Ό μ¬μ©ν μ±κΈν΄ ν¨ν΄
*/
class SingletonWithClass {
static let shared = SingletonWithClass()
var value: Int = 10
private init() {}
}
let a = SingletonWithClass.shared
a.value = 100
print("SingletonWithClass.shared", SingletonWithClass.shared.value)
print("a", a.value)
/*
μΆλ ₯
SingletonWithClass.shared 100
a 100
*/
// ꡬ쑰체λ₯Ό μ¬μ©ν μ±κΈν΄ ν¨ν΄
struct SingletonWithStruct {
static let shared = SingletonWithStruct()
var value: Int = 10
private init() {}
}
var b = SingletonWithStruct.shared
b.value = 100
var c = SingletonWithStruct.shared
c.value = 200
print("SingletonWithStruct.shared", SingletonWithStruct.shared.value)
print("b", b.value)
print("c", c.value)
/*
SingletonWithStruct.shared 10
b 100
c 200
*/
μ±κΈν΄ ν¨ν΄μ μ₯λ¨μ
thread-safetyν μ±κΈν€ μ¬μ©
'Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[ Swift ] μλ¬ νΈλ€λ§ (0) | 2025.02.12 |
---|---|
[ iOS ] (0) | 2025.02.07 |
[ Swift ] Swiftλ? (0) | 2023.10.08 |
[ Swift ] zip(_:_:) (1) | 2023.10.08 |
[ Swift ] isCase | isLowercase | isUppercase (0) | 2023.10.04 |