Ios Swift-实例成员不能用于类型自定义类
我不知道为什么我不能在这个参数上调用token,我一直在这行上出错Ios Swift-实例成员不能用于类型自定义类,ios,swift,Ios,Swift,我不知道为什么我不能在这个参数上调用token,我一直在这行上出错 .ExtraHeaders(["Authorization": token]) 错误 实例成员“令牌”不能用于类型“SocketIOManager” 完整代码 import SocketIOClientSwift import KeychainAccess class SocketIOManager: NSObject { static let sharedInstance = SocketIOManager()
.ExtraHeaders(["Authorization": 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()
}
}
问题可以归结为一小段代码:
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
}
及
第一个选项的缺点是您必须使用var,并且您需要显式地编写self
,第二个选项的缺点是您的初始化代码与声明的位置不符。(虽然init()
是一个非常合乎逻辑的地方,可以下一步查看)这两种方式都要求您显式地声明类型。你必须决定什么对你更重要,如果可能的话,我会选择保留常量。但是,当您已经在使用var时,最好使用第一个选项
请注意,如果选择第二个选项,并且您的类继承自另一个类,则需要在调用super.init()
之前初始化该成员:
如果您不这样做,编译器会对您大喊大叫,因此很难出错。我尝试了您的建议,它不起作用。我使用第一个选项,但仍然收到一个错误,
lazy var socket=SocketIOClient(socketURL:NSURL(string:https://testing.herokuapp.com“”),选项:[.Log(true),.ExtraHeaders([“授权”:token])]
我添加了lazy,但由于某些原因,当前错误一直显示。@airsoftFreak我已经编辑了我的答案,现在应该可以了。在第二个选项中考虑一个变量,没有一个好的原因,在SWIFT中做一个常数不是很好的做法。我添加了Self.ToMo,但是现在的错误是不同的,它是代码> SokKyToMaMaGER没有成员令牌< /Calp> <代码>值'NSbObjult>()-SokKeToMaMaGER没有成员“令牌”< /Cord>是完全错误。
class Test {
let test = "test"
let test2:String
init() {
test2 = test + "2" // you can set constants in initializers
}
}
class Test: SuperTest {
let test = "test"
let test2:String
override init() {
test2 = test + "2"
super.init()
}
}