在 init() 之前或在 init() 内部读取 UserDefaults

问题描述

我在将我的 default_ip 从我的 UserDefaults 获取到 SocketManager 时遇到问题。

final class Service: ObservableObject{    
    let defaults = UserDefaults.init(suiteName: "group.com.Scheduled-countdown.settings")
    let manager = SocketManager(socketURL: URL(string: "http://172.20.10.4:3000")!,config: [.log(false),.compress,.path("/ws")])

    init(){
        let default_ip = defaults?.string(forKey: "ip_adress") ?? "nothing"
        let ipString : String = "http://\(default_ip):3000"
        //let manager = SocketManager(socketURL: URL(string: ipString)!,.path("/ws")])
        
        print(ipString)
        print(default_ip)
     }
}

如果我在 init() 上面有 SocketManager 它会连接但我不能有 default_ip 因为它上面说

不能在属性初始值设定项中使用实例成员“defaults”; 属性初始值设定项在 'self' 可用之前运行

那么我该如何解决这个问题?

我也上传了视频来说明问题 https://www.youtube.com/watch?v=teqr20AnTVM

解决方法

改用惰性变量对我有帮助。

final class Service: ObservableObject{    
    let defaults = UserDefaults.init(suiteName: "group.com.Scheduled-countdown.settings")
    lazy var default_ip = defaults?.string(forKey: "ip_adress") ?? "Nothing"
    lazy var ipString : String = "http://\(default_ip):3000"
    lazy var  manager = SocketManager(socketURL: URL(string: ipString)!,config: [.log(false),.compress,.path("/ws")])


    init(){
        print(ipString)
        print(default_ip)
     }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...