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


88

Apple의 Using Swift with Cocoa 및 Objective-C 문서 (Swift 3 용으로 업데이트 됨)에서는 다음과 같은 Singleton 패턴 예제를 제공합니다.

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()

        // setup code

        return instance
    }()
}

이 싱글 톤이 문자열의 가변 배열을 관리해야한다고 상상해 봅시다. 해당 속성을 어떻게 / 어디서 선언하고 빈 [String]배열로 올바르게 초기화되는지 확인 합니까?

답변:


236

나를 위해 이것이 가장 좋은 방법입니다. 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]()

}

4
이 답변을 찬성했지만 Swift 3 구문과 일치하려면 "sharedInstance"를 "shared"로 변경해야합니다.
B-Rad

1
빠른 3 빠른 2에서 회귀가 없다면 당신은하지 않습니다
의 Thibaut 노아

1
공유 후 유형은 생략 할 수 있습니다. static let shared = Singleton()
chriswillow

1
당신이 작성하지 않아도 @YannickSteph static let shared: Singleton = Singleton()대신 당신은 쓸 수 있습니다static let shared = Singleton()
chriswillow

3
@RomanN 아니요 init는 클래스를 상속하지 않기 때문에 재정의 할 수 없습니다. 할 수 있다면이 예제를 통해 final class Singleton: NSObject { private override init() { } }
YannSteph

59

이와 같이 빈 배열을 초기화 할 수 있습니다.

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
    }
}

이 방법은 확장 프로그램에서 작동하지 않습니까? extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
Andrew

1
Apple class var이 iOS 10에서 싱글 톤 (예 : UIApplication)을 사용하는 것이 흥미 롭습니다. 그들의 구현은 이것과 동일합니까?
jjatie

2
나는 싱글 톤 init 메소드를 선호 private하지 않는다 internal. 이것은 다른 사람들이이 클래스에 대해 기본 '()'이니셜 라이저를 사용하는 것을 방지합니다.
Kumar C

1
@KumarC 당신이 맞습니다, 우리가에 추가하면 문제가 해결되지 않을 것 private입니다 init.

@TikhonovAlexander 더 많은 정보를 가져올 수 있습니까?
Dominique Vial

30

애플의 문서에 따르면 : Swift에서는 여러 스레드에서 동시에 액세스하더라도 한 번만 느리게 초기화되도록 보장되는 정적 유형 속성을 간단히 사용할 수 있습니다 .

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()
}

초기화 방법 :

class Singleton {

    // MARK: - Shared

    static let shared = Singleton()

    // MARK: - Initializer

    private init() {
    }

}

3
왜 init ()가 비공개가 아닌가?
XcodeNOOB

0

모든 초기화는 init 메소드에서 수행됩니다. 여기서 싱글 톤과 비 싱글 톤 사이에는 차이가 없습니다.


26
질문에 직접 답변하는 추가 코드 스 니펫은이 답변을 더 유용하게 만듭니다.
Reda Lemeden 2016-06-22
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.