Swift 运行一次并返回值

问题描述 投票:0回答:2

我试图理解 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”或“()”短语中的哪些指示参数是什么传入的,返回的,或者返回是如何实现的。

这将在多线程情况下使用。

如有提示,我们将不胜感激。更好的是,有一个“样板”/“骨架”解决方案来帮助我开始,我将填写其余的内容。

谢谢

swift token runonce
2个回答
0
投票

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


0
投票

我想说,如果我理解正确的话,你正在尝试实现一个单例实例,这是在 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

© www.soinside.com 2019 - 2024. All rights reserved.