[singleton] 스위프트 3의 속성을 가진 싱글 톤

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 메소드에서 수행됩니다. 여기서 싱글 톤과 비 싱글 톤 사이에는 차이가 없습니다.


답변