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

时间:2016-05-31 08:19:18

标签: ios swift

我不知道为什么我不能在这个参数上调用令牌,我一直在这行上出错

.ExtraHeaders(["Authorization": token])

错误

  

实例成员'token'不能用于'SocketIOManager'类型

完整代码

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


}

1 个答案:

答案 0 :(得分:0)

问题可以归结为一小段代码:

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

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