我不知道为什么我不能在这个参数上调用令牌,我一直在这行上出错
.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()
}
}
答案 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()
}
}
如果你不这样做,编译器会对你大喊大叫,所以很难弄清楚。