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