gpt4 book ai didi

swift - 在不同文件中读取时如何阻止变量返回默认值

转载 作者:行者123 更新时间:2023-11-30 10:28:40 25 4
gpt4 key购买 nike

我有一个 DiscoveredSerialNumbers 类,我想从各种 swift 文件访问它:

class DiscoveredSerialNumbers {
var snConnect: String = ""
}

在我的 ViewController 中,我根据选取器 View 中的选择更改 snConnect 的值。

class ViewController: UIViewController, UIPickerViewDataSource,UIPickerViewDelegate {

@IBOutlet weak var SerialNumbers: UIPickerView!

var serialNums: [String] = [String]()
...
override func viewDidLoad() {
...

SerialNumbers.dataSource = self
SerialNumbers.delegate = self
}
...
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let global = DiscoveredSerialNumbers()
global.snConnect = serialNums[row]
print(serialNums[row])
print(global.snConnect)
}
}

当我打印出以下行中设置的 snConnect 新值时:

global.snConnect = serialNums[row]

之后我立即获得 snConnect 的新更新值。

但是,当我尝试在另一个 swift 文件中访问 snConnect 的更新值时,该文件控制以下代码中的不同 ViewController:

 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
let global = DiscoveredSerialNumbers()
var sn = global.snConnect
...
}

snConnect 的值恢复为原始值“”。

如何阻止该值恢复为初始值?我认为这与我初始化类 DiscoveredSerialNumbers 有关,但我不知道如何在不同的 swift 文件中访问 snConnect 的值。

编辑:感谢 Don 的评论,我试图让 snConnect 值在应用程序启动的实例之间保持不变。我想在主应用程序中设置 snConnect 的值,并在启动主应用程序的扩展程序(在本例中为自定义键盘扩展程序)时访问它。

最佳答案

更新:问题有点误导您实际上需要保存变量。我不确定应用程序和键盘扩展的 UserDefaults 是否相同,您可以尝试一下。


class DiscoveredSerialNumbers {

static var main = DiscoveredSerialNumbers()
var snConnect: String {
get {
// Read from UserDefaults
return UserDefaults.standard.string(forKey: "snConnect") ?? ""
}
set {
// Save to UserDefaults
UserDefaults.standard.set(newValue, forKey: "snConnect")
}
}
init() {
print("New instance of DiscoveredSerialNumbers initialized.")
}
}

您可以通过多种不同的方式来做到这一点,然而,最简单的方法是创建一个 DiscoveredSerialNumbers() 对象的单例,这样您的对象和值就可以通过它全局使用。

(尽管应谨慎使用此方法,但它可能会导致许多问题)

class DiscoveredSerialNumbers {

static var main = DiscoveredSerialNumbers()
var snConnect: String = ""
init() {
print("New instance of DiscoveredSerialNumbers initialized.")
}
}

现在,每当您调用 DiscoveredSerialNumbers.main.snConnect 时,旧值都会被保留,并且可以从任何地方使用/更改。

编辑:这是一个示例 Playground 代码,供您测试单例如何工作


class Singleton
{
var someVariable = ""
static var main = Singleton()
}

class ClassA
{
init() {
Singleton.main.someVariable = "Hey I was changed in Class A"
}
}

class ClassB
{
init() {
print(Singleton.main.someVariable)
Singleton.main.someVariable = "And now I'm changed in class B"
}
}

let _ = ClassA()
let _ = ClassB()
print(Singleton.main.someVariable)

关于swift - 在不同文件中读取时如何阻止变量返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59637059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com