'lazy'可能不会在已经很懒惰的global上使用

air*_*eak 6 swift

我的问题是,无论如何我都需要初始化该特定变量,因为还有另一个对象依赖于此变量的值

这是代码(我将变量设置为global

lazy var getToken = {
        if let token = keychain["token"].string {
            return token
        }
    }()
Run Code Online (Sandbox Code Playgroud)

我正在使用惰性,因为无论如何我都需要使用它来进行初始化。

当我尝试将其放在全局文件中时出现此错误错误

'lazy'可能不会在已经很懒惰的global上使用

这是取决于此令牌的对象

单例设计

class SocketIOManager: NSObject {

    static let sharedInstance = SocketIOManager()

    let socket: SocketIOClient!

    private override init() {
        super.init()
        socket = SocketIOClient(socketURL: URL(string: mainURL)!, .connectParams(["token": getToken])])
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你看看socket ="token",这就是我需要的令牌

Pra*_*iya 8

重要的

user2908517的回答是完全错误的。所以请求阅读一次。

根据文档 https://docs.swift.org/swift-book/LanguageGuide/Properties.html

全局常量和变量总是以类似于延迟存储属性的方式延迟计算。与惰性存储属性不同,全局常量和变量不需要用惰性修饰符标记。

局部常量和变量永远不会被延迟计算。

这意味着 全局常量和变量不是类属性,它们就像海洋和河流一样不同。请求阅读/sf/answers/2368613691/

默认情况下,类属性不是惰性的,当它的 init 方法被称为设计或说服时,类属性会自动初始化。

我不明白你为什么把懒惰放在那里?

当您想在编译器实际需要时初始化变量时,可以使用 Lazy。

其他惰性类型(普通变量)将在指定初始化程序调用后立即初始化

您可以使用

var getToken : String? = { if let token = keychain["token"].string { return token } }
Run Code Online (Sandbox Code Playgroud)


use*_*517 6

我不确定“我正在使用惰性,因为无论如何我都需要初始化它”,这是什么意思,但是默认情况下所有全局变量都是惰性的,这就是为什么不需要(也不允许)放置关键字”全局变量声明之前的“懒惰”:根据其性质,它们已经是懒惰的。

  • 全局常量和变量总是以类似于延迟存储属性的方式延迟计算。与惰性存储属性不同,全局常量和变量不需要用惰性修饰符标记 - 形式 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html (2认同)