我试图理解 Swift“运行一次”,并且有很多例子可以找到。但我似乎找不到一个可以证明返回值的。我需要这个,因为我正在尝试转换 ObjC 函数:
static OCNM *ocNM = nil;
@interface OCNM()
...some properties defined...
@end
@implementation OCNM
+(OCNM *) sM {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
... instantiates ocNM
...set ocNM properties
});
return ocNM;
}
@end
这是通过另一个 ObjC 类调用的: [OCNM sM].someOtherFunctionInOCNM
我认为,这里的意图是,一旦执行了“运行一次”代码,任何其他调用,即使来自其他类,也只会获得现有的 ocNM 作为返回值,而不会再次运行实例化代码。
基于大量不同的在线示例,我无法开发一个基于 Swift 的类来执行相同的操作。
作为 Swift 的初学者,我遇到了一个障碍:无法完全理解那些没有返回值的示例的运行一次实现。尝试修改各种示例以添加返回值只会让情况变得更糟。
当前的快速尝试:
...imports here...
var ocNM:OCNM! = nil
class OCNM:NSOBJECT{
...initialize vars here...
@objc class func sM() -> OCNM!{
var onceToken:dispatch_once_t
dispatch_once(&onceToken, {
... instantiates ocNM
...set ocNM properties
})
return ocNM;
}
我知道 Swift 已经弃用了一次调度实现,但是我发现的各种示例似乎并没有清楚地表明如何替换令牌代码,或者各种“Void”或“()”短语中的哪些指示参数是什么传入的,返回的,或者返回是如何实现的。
这将在多线程情况下使用。
如有提示,我们将不胜感激。更好的是,有一个“样板”/“骨架”解决方案来帮助我开始,我将填写其余的内容。
谢谢
static OCNM *ocNM = nil
和+(OCNM *)
表明该属性是一个class属性。
Swift 的等价物非常简单
class OCNM {
static let ocNM = OCNM()
}
如果你想设置一些其他属性once实现
init
标记为private
class OCNM {
let foo: String
static let ocNM = OCNM()
private init() {
foo = "Hello World"
}
}
对于线程安全实例,请考虑
actor
。
我想说,如果我理解正确的话,你正在尝试实现一个单例实例,这是在 Objective C 中通过dispatch_once实现的。
要快速执行此操作,您只需执行以下操作即可
static let shared: String = "Shared String"
或如您的代码所述
static let shared: OCNM = OCNM()
如何使用此功能的示例:
class OCNM {
static let shared: OCNM = .init()
let propOne: String
let propTwo: String
private init() {
propOne = "Ok prop one"
propTwo = "Ok prop two"
}
}
如何在代码中使用它
class UsingSharedInstance {
init() {
print(OCNM.shared.propOne)
}
}
一篇可以提供帮助的文章
https://www.hackingwithswift.com/example-code/language/what-is-a-singleton