@interface MySingleton: NSObject+ (MySingleton *)setup:(MyConfig *)config;+ (MySingleton *)shared;@property (Readonly,strong,nonatomic) MyConfig *config;@end@implementation MySingletonstatic MySingleton *sharedInstance = nil;+ (MySingleton *)setup:(MyConfig *)config { static dispatch_once_t oncetoken; dispatch_once(&oncetoken,^{ sharedInstance = [[self alloc] initWithConfig:config]; }); // Some other stuff here return sharedInstance;}+ (MySingleton *)shared { if (sharedInstance == nil) { NSLog(@"error: shared called before setup"); } return sharedInstance;}- (instancetype)initWithConfig:(RVConfig *)config { self = [super init]; if (self) { _config = config; } return self;}@end
我被困在Swift:
class AsteroID { var config: ASTConfig? // This actually should be read-only class func setup(config: ASTConfig) -> AsteroID { struct Static { static let instance : AsteroID = AsteroID(config: config) } return Static.instance } class var shared: AsteroID? { // ??? } private init(config: ASTConfig) { self.config = config }}
我认为我仍然以客观的方式思考,不能用快速的方法来计算出来.任何帮助?
您的Objective-C代码的字面翻译可能是:private var _asteroIDSharedInstance: AsteroID!class AsteroID { private var config: ASTConfig? class func setup(config: ASTConfig) -> AsteroID { struct Static { static var oncetoken: dispatch_once_t = 0 } dispatch_once(&Static.oncetoken) { _asteroIDSharedInstance = AsteroID(config: config) } return _asteroIDSharedInstance } class var sharedInstance: AsteroID! { // personally,I'd make this `AsteroID`,not `AsteroID!`,but this is up to you if _asteroIDSharedInstance == nil { println("error: shared called before setup") } return _asteroIDSharedInstance } init(config: ASTConfig) { self.config = config }}
或者,在Swift 1.2中,您可以消除静态结构并简化安装程序:
private static var setupOncetoken: dispatch_once_t = 0class func setup(config: ASTConfig) -> AsteroID { dispatch_once(&setupOncetoken) { _asteroIDSharedInstance = AsteroID(config: config) } return _asteroIDSharedInstance}
这真的不是一个单身人士. (我怀疑你知道这一点,但我提到为了未来读者的利益).通常单例可以在首次使用的任何地方进行实例化.这是一个场景,它只在一个特定的地方进行实例化和配置,您必须注意在尝试在其他地方使用它.这是非常好奇的做法.我们失去了一些单例功能,但仍然遭受所有传统的单身限制.
很明显,如果你确定,那没关系.但是,如果你有趣的替代品,两个人就跳出来:
>使这个真正的单例:您可以通过在init方法中移动ASTConfig的实例化来实现此目的(消除在使用sharedInstance之前必须调用setup的依赖关系).然后你可以退出设置,只要像你一样使用你的单身.所产生的实现也大大简化.它减少到像:
class AsteroID { static let sharedInstance = AsteroID() private let config: ASTConfig init() { self.config = ASTConfig(...) }}
显然,我怀疑恶魔是在这个ASTConfig对象的细节,但是如果你可以做一个正确的单例执行,你可以看到这是更简单(特别是在Swift 1.2).而且上面消除了设置vs sharedInstance问题.消除私人全球.一切都简单一些
话虽如此,我认为你有令人信服的理由这样做.也许有一些关键原因,您必须将ASTConfig对象传递给安装方法,而不是仅在AsteroID类的初始化中实例化.
我只是觉得有必要指出,一个适当的单例将是非常好的(两者都更简单的实现和消除理论竞争条件).
>完全放弃单例模式:假设使用一个合适的单身,如上所述,下一个问题是你是否应该放弃任何剩余的单身,只是实例化一个简单的小行星,你正在调用设置,然后而不是依赖sharedInstance,只是传递给真正需要它的对象.
您已经指定您要手动将AsteroID设置在前面,所以让我们正式确定这种关系,并消除单身人士介绍的许多结构性缺陷(参见What’s Alternative to Singleton或谷歌“单身人士”).
不要误会我我假设你有令人信服的理由按照你的方式做到这一点,如果目前的实现方式适用于你,那没关系.但这是一个非常好奇的做法,在这种做法中,您不用享受所有的好处就承担单身人士的理论责任.
总结以上是内存溢出为你收集整理的swift – 具有参数的Singleton和init全部内容,希望文章能够帮你解决swift – 具有参数的Singleton和init所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)