Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-实例成员不能用于类型自定义类_Ios_Swift - Fatal编程技术网

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

Ios Swift-实例成员不能用于类型自定义类,ios,swift,Ios,Swift,我不知道为什么我不能在这个参数上调用token,我一直在这行上出错 .ExtraHeaders(["Authorization": token]) 错误 实例成员“令牌”不能用于类型“SocketIOManager” 完整代码 import SocketIOClientSwift import KeychainAccess class SocketIOManager: NSObject { static let sharedInstance = SocketIOManager()

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

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