iOS swift Singleton init方法

时间:2015-04-07 06:38:39

标签: ios sockets swift singleton

我通过采用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

2 个答案:

答案 0 :(得分:0)

引用Swift编程语言,它回答了你的问题:

  

“Swift的编译器执行四项有用的安全检查以确保   完成两阶段初始化没有错误:“

     

安全检查1“指定的初始化程序必须确保所有的   “它的类引入的属性在它之前被初始化   委托一个超类初始化程序。“

     

摘自:Apple Inc.“The Swift Programming Language。”iBooks。   https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

致谢:Ruben

上的this question

另一种解决方案是制作“插座”。变量unwrapped optional。

var socket:IOSocket!

答案 1 :(得分:0)