2016-06-08 12 views
1

在Objective-C,这很适合于一Singleton in Interface Builder使用辛格尔顿在Interface Builder与斯威夫特

static Universe *instance; 

+ (Universe *)instance { 
    return instance; 
} 

+ (id)hiddenAlloc { 
    return [super alloc]; 
} 

+ (id)alloc { 
    return [self instance]; 
} 

+ (void)initialize { 
    static BOOL initialized = NO; 
    if (!initialized) { 
     initialized = YES; 
     instance = [[Universe hiddenAlloc] init]; 
    } 
} 

并且由于ALLOC的覆盖,IB将拿起Universe

的唯一实例这可能在Swift中吗? [我已经坚持我的解决方案,这是here on Github。]

+1

不,因为在Swift中没有'alloc'这样的东西。你正在进行基本的内存管理,Swift不会让你这样做。如果这对你很重要,为什么不在Objective-C中编写这部分代码呢? – matt

+0

@matt谢谢你的同意。我试图想象一个混合体,其中singleton-ness在Objective-C中,然后'Universe'是一个Swift子类。在我看来,这是不可能的,因为'初始化'必须与特定类绑定,对吧? –

+0

不,可以为子类调用'initialize'。这就是为什么一个好的'initialize'总是检查这个实际是什么类的原因。 – matt

回答

0

这是一个开始(我认为)。 Objective-C中的超类。

请查看Github ...任何帮助赞赏!

Singleton.h(必须在桥接报头)

#import <Foundation/Foundation.h> 

@interface Singleton : NSObject 

+ (Singleton *)instance; 

@end 

Singleton.m

#import "Singleton.h" 

@implementation Singleton 

static Singleton *instance; 

+ (Singleton *)instance { 
    return instance; 
} 

+ (id)hiddenAlloc { 
    return [super alloc]; 
} 

+ (id)alloc { 
    return [self instance]; 
} 

+ (void)initialize { 
    static BOOL initialized = NO; 
    if (!initialized) { 
     initialized = YES; 
     instance = [[self hiddenAlloc] init]; 
    } 
} 

@end 

Universe.swift

import UIKit 

// MARK: - convenience access 
let universe = Universe.sharedInstance 

@objc(Universe) 
class Universe : Singleton { 

    static let sharedInstance = Universe() 

    override class func instance() -> Singleton { 
     return sharedInstance 
    } 
} 

Universe对象始终显示相同的散列(和内存地址),但它不保留其IBOutlet变量...所以这仍然是100%破碎,但它是一个开始(可能)。

+0

这很奇怪。 'initialize'正好被调用两次(一次用于'Universe'),其他所有内容似乎都很正确!不知道我的'IBOutlets'是怎么回事......无论如何 –

+0

如果你真的想要一个'单身人士',那么你应该有一个私人的初始化方法,以便没有别的可以创建你的单身人士实例。你也应该让课程成为最终的。 – Gargoyle

+0

谢谢@Gargoyle我会尽快做到这一点。 –