Swift - 实例成员不能用于类型自定义类



我不知道为什么我不能在这个参数上调用令牌,我总是在这一行上收到错误

.ExtraHeaders(["Authorization": token])

错误

实例成员"令牌"不能用于类型"套接字IOManager"

完整代码

import SocketIOClientSwift
import KeychainAccess
class SocketIOManager: NSObject {
    static let sharedInstance = SocketIOManager()

    let keychain = Keychain(server: "https://testing.herokuapp.com", protocolType: .HTTPS)
    var token: String {
        get {
            return String(keychain["token"])
        }
    }

    let socket = SocketIOClient(socketURL: NSURL(string: 
       "https://testing.herokuapp.com")!, 
       options: [.Log(true), .ExtraHeaders(["Authorization": token]) ])

    override init() {
        super.init()
    }

    func establishConnection() {
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }

}

这个问题可以提炼成一小段代码:

class Test {
    let test = "test"
    let test2 = test + "2" // instance member 'test' cannot be used on type 'Test'
}

问题是,当初始化这些字段时,对象还不存在。有两种方法可以解决此问题:

 class Test {
    let test = "test"
    lazy var test2:String = self.test + "2" // since test2 is lazy, it only gets computed at a time when the object already exists
}

class Test {
    let test = "test"
    let test2:String
    init() {
        test2 = test + "2" // you can set constants in initializers
    }
}

第一个选项的缺点是你必须使用 var,并且你需要显式编写 self ,第二个选项的缺点是你的初始化代码不在声明所在的位置。(虽然接下来init()是一个非常合乎逻辑的地方)这两种方式都要求您显式声明类型。你必须决定什么对你更重要,我会选择尽可能保留常量常量。但是,当您已经在使用 var 时,不妨选择第一个选项。

请注意,如果选择第二个选项并且您的类继承自另一个类,则需要在调用 super.init() 之前初始化成员:

class Test: SuperTest {
    let test = "test"
    let test2:String
    override init() {
        test2 = test + "2"
        super.init()
    }
}

如果你不这样做,编译器会对你大喊大叫,所以很难弄错。

最新更新