在带有Swift的Interface Builder中使用Singleton

在带有Swift的Interface Builder中使用Singleton,swift,interface-builder,Swift,Interface Builder,在Objective-C中,这一点在a中效果良好 由于alloc被覆盖,IB将获取Universe的唯一实例 这在Swift中可能吗?[我被我的解决方案卡住了,那就是。]这是一个开始(我想)。Objective-C中的超类 请在。。。感谢您的帮助 Singleton.h(必须在桥接头中) Universe.swift import UIKit // MARK: - convenience access let universe = Universe.sharedInstance @objc(

在Objective-C中,这一点在a中效果良好

由于alloc被覆盖,IB将获取
Universe的唯一实例

这在Swift中可能吗?[我被我的解决方案卡住了,那就是。]

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

请在。。。感谢您的帮助

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

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%的失败,但这是一个开始(可能)。

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

请在。。。感谢您的帮助

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

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%失败,但这是一个开始(可能)。

不,因为Swift中没有
alloc
这样的东西。您正在大量使用基本内存管理,Swift不会让您这样做。如果这对您很重要,为什么不用Objective-C编写这部分代码?@matt对此表示感谢,同意。我试着想象一个混合体,其中单态性在Objective-C中,然后
宇宙
是一个快速的子类。在我看来,这是不可能的,因为
initialize
必须绑定到特定的类,对吗?不,子类可以调用
initialize
。这就是为什么一个好的
initialize
总是检查这个类到底是什么。这可能会很有趣,我会看看我想出了什么,谢谢!嗨,马特,我在下面贴了一个答案。它几乎可以工作了,但不知何故它丢失了
IBOutlet
变量(尽管它的散列值和内存地址保持不变)。欢迎任何建议、提示、指导(或劝阻,如果必要的话)。谢谢不,因为Swift中没有alloc
。您正在大量使用基本内存管理,Swift不会让您这样做。如果这对您很重要,为什么不用Objective-C编写这部分代码?@matt对此表示感谢,同意。我试着想象一个混合体,其中单态性在Objective-C中,然后
宇宙
是一个快速的子类。在我看来,这是不可能的,因为
initialize
必须绑定到特定的类,对吗?不,子类可以调用
initialize
。这就是为什么一个好的
initialize
总是检查这个类到底是什么。这可能会很有趣,我会看看我想出了什么,谢谢!嗨,马特,我在下面贴了一个答案。它几乎可以工作了,但不知何故它丢失了
IBOutlet
变量(尽管它的散列值和内存地址保持不变)。欢迎任何建议、提示、指导(或劝阻,如果必要的话)。谢谢这很奇怪。
initialize
被精确调用了两次(一次用于
Universe
),其他一切似乎都很正确!不确定我的
IBOutlets
怎么了。。。无论如何,如果你真的想要一个“singleton”,那么你应该有一个私有的init方法,这样就没有其他方法可以创建你的singleton实例了。您还应该将该类设置为最终类。感谢@Gargoyle,我会在该类正常工作后立即执行该操作。现在,添加GitHub链接更容易操作,正如您在这里看到的----问题是每次调用
init
时,虽然它提供了相同的对象,但所有属性都会设置为其初始赋值(而且,
willSet
等在初始化期间没有运行)这很奇怪。
initialize
被精确调用了两次(一次用于
Universe
)其他一切似乎都是正确的!不确定我的
IBOutlets
…无论如何,如果你真的想要一个“singleton”,那么你应该有一个私有的init方法,这样其他任何东西都不能创建你的singleton实例。你也应该将类设置为final。谢谢@Gargoyle,我会尽快完成它。这很简单呃,现在要玩的是,添加GitHub链接,正如您在这里看到的-----问题是每次调用
init
时,虽然它提供了相同的对象,但所有属性都会被设置为其初始赋值(并且
willSet
等不会在init期间运行)
#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
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
    }
}