Apple의 Using Swift with Cocoa 및 Objective-C 문서 (Swift 3 용으로 업데이트 됨)에서는 다음과 같은 Singleton 패턴 예제를 제공합니다.
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
이 싱글 톤이 문자열의 가변 배열을 관리해야한다고 상상해 봅시다. 해당 속성을 어떻게 / 어디서 선언하고 빈 [String]
배열로 올바르게 초기화되는지 확인 합니까?
답변
나를 위해 이것이 가장 좋은 방법입니다. init를 비공개로 만드십시오. Swift 3 \ 4 \ 5 구문
// MARK: - Singleton
final class Singleton {
// Can't init is singleton
private init() { }
// MARK: Shared Instance
static let shared = Singleton()
// MARK: Local Variable
var emptyStringArray = [String]()
}
답변
이와 같이 빈 배열을 초기화 할 수 있습니다.
class Singleton {
//MARK: Shared Instance
static let sharedInstance : Singleton = {
let instance = Singleton(array: [])
return instance
}()
//MARK: Local Variable
var emptyStringArray : [String]
//MARK: Init
init( array : [String]) {
emptyStringArray = array
}
}
또는 다른 접근 방식을 선호하는 경우이 방법이 문제가되지 않습니다.
class Singleton {
//MARK: Shared Instance
static let sharedInstance : Singleton = {
let instance = Singleton()
return instance
}()
//MARK: Local Variable
var emptyStringArray : [String]? = nil
//MARK: Init
convenience init() {
self.init(array : [])
}
//MARK: Init Array
init( array : [String]) {
emptyStringArray = array
}
}
답변
애플의 문서에 따르면 : Swift에서는 여러 스레드에서 동시에 액세스하더라도 한 번만 느리게 초기화되도록 보장되는 정적 유형 속성을 간단히 사용할 수 있습니다 .
class Singleton {
// MARK: - Shared
static let shared = Singleton()
}
초기화 방법 :
class Singleton {
// MARK: - Shared
static let shared = Singleton()
// MARK: - Initializer
private init() {
}
}
답변
모든 초기화는 init 메소드에서 수행됩니다. 여기서 싱글 톤과 비 싱글 톤 사이에는 차이가 없습니다.