'懒惰'可能不会用于已经很懒的全局

时间:2017-11-19 05:28:43

标签: swift

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

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

lazy var getToken = {
        if let token = keychain["token"].string {
            return token
        }
    }()

我正在使用懒惰,因为无论如何我都需要将其初始化。

当我尝试将其置于全局文件

时出现此错误错误
  

'lazy'可能不会用于已经很懒的全局

这是取决于此令牌的对象

单身人士设计

class SocketIOManager: NSObject {

    static let sharedInstance = SocketIOManager()

    let socket: SocketIOClient!

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

如果您在socket =查看"token",那就是我需要令牌的地方

2 个答案:

答案 0 :(得分:5)

我不确定你的意思"我使用懒惰因为我需要这个来初始化而不管是什么。",但是所有全局变量都默认是懒惰的,这就是为什么不需要(也不允许)放置关键字"懒惰"在全局变量声明之前:它们本质上已经是懒惰的。

答案 1 :(得分:1)

重要

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

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

  

全局常量和变量总是懒惰地计算,与Lazy Stored Properties类似。与延迟存储的属性不同,全局常量和变量不需要使用延迟修饰符进行标记。

     

局部常量和变量永远不会懒惰计算。

这意味着全局常量和变量而不是类属性它们就像海洋和河流一样不同。请求阅读https://stackoverflow.com/a/33837338/4601900

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

我不明白为什么你在那边偷懒?

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

其他惰性类型(正常变量)将在指定的初始化程序

时立即初始化

您可以使用

var getToken : String? = { if let token = keychain["token"].string { return token } }