簡體   English   中英

iOS Swift Singleton初始化方法

[英]iOS swift Singleton init method

我正在通過采用socket.IO-objc編寫單例類來訪問套接字,這是我到目前為止所做的:

class Singleton_SocketManager: NSObject, SocketIODelegate {
    var isSocketConnected: Bool = false
    var socket: SocketIO

    override init() {
        super.init()
    }

    class var sharedInstance: Singleton_SocketManager {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: Singleton_SocketManager? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = Singleton_SocketManager()
        }
        return Static.instance!
    }
}

但是編譯器抱怨:

Property 'self.socket' not initialized at super.init call

我應該如何在這里編寫init方法以使編譯錯誤消失?

順便說一句,我將上面的代碼從Objective-C轉換了,在obj-c中,SocketIO的初始化如下:

    self.socket = [[SocketIO alloc] initWithDelegate:self];

如果我這樣放置init方法:

    override init() {
    self.socket = SocketIO(delegate: self)
    super.init()
}

它抱怨:

self used before super.init call

是否有必要從NSObject繼承應用程序? 我遇到了類似的情況,我需要將Singleton設置為代表(因此我需要self)。 通過不繼承NSObject,我的問題得以解決-那時無論如何都無需調用super.init()

蘋果對Singleton 建議是這樣的:

如果您需要執行初始化以外的其他設置,則可以將閉包的調用結果分配給全局常量:

class Singleton {
    static let sharedInstance: Singleton = {
        let instance = Singleton()
        // setup code
        return instance
    }()
}

但是(我認為)最新的語法也可以在他們的快速博客中找到,我更喜歡:

class Singleton {
    static let sharedInstance = Singleton()

    private init() {
        // do your init here
        print("Singleton created")
    }
}

引用Swift編程語言,它回答了您的問題:

“ Swift的編譯器執行四項有用的安全檢查,以確保兩階段初始化完成且沒有錯誤:”

安全檢查1“指定的初始值設定項必須確保由其類引入的所有屬性在將其委托給超類初始值設定項之前都已初始化。”

摘自:Apple Inc.“快速編程語言”。iBooks。 https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

鳴謝: 魯賓這個問題上

另一種解決方案是使'socket'變量的未包裝選項是可選的。

var socket:IOSocket!

您可以按照以下URL中建議的以下選項執行Swift類中的以下URL 錯誤:在super.init調用中未初始化屬性-如何在其初始值設定項參數 var socket中初始化需要使用self的屬性 :SocketIO!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM