【问题标题】:Use Singleton in Interface Builder with Swift在 Swift 的 Interface Builder 中使用 Singleton
【发布时间】:2016-06-08 19:41:46
【问题描述】:

在 Objective-C 中,这对 Singleton in 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。]

【问题讨论】:

  • 不,因为在 Swift 中没有 alloc 这样的东西。你正在修改基本的内存管理,而 Swift 不会让你这样做。如果这对你很重要,为什么不用 Objective-C 编写这部分代码呢?
  • @matt 谢谢你,同意了。我试图想象一个混合体,其中单例在 Objective-C 中,然后 Universe 是一个 Swift 子类。在我看来这是不可能的,因为 initialize 必须与特定的类相关联,对吧?
  • 不,可以为子类调用initialize。这就是为什么一个好的initialize 总是检查这实际上是什么类。
  • 这可能很有趣,我会看看我的想法,谢谢!
  • 嗨@matt 我在下面发布了一个答案。它接近工作,但不知何故丢失了IBOutlet 变量(尽管它的哈希值和内存地址保持不变)。欢迎任何建议、提示、指导(或劝阻,如果这是必要的话)。谢谢!

标签: swift interface-builder


【解决方案1】:

这是一个开始(我认为)。 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% 损坏,但它是一个开始(可能)。

【讨论】:

  • 这很奇怪。 initialize 恰好被调用了两次(Universe 一次),其他一切似乎都如此正确!不知道我的IBOutlets 怎么了...无论如何
  • 如果你真的想要一个“单例”,那么你应该有一个私有的 init 方法,这样就没有其他方法可以创建你的单例实例了。您还应该将课程设置为最终课程。
  • 谢谢@Gargoyle,我会尽快完成这项工作。
  • 现在玩起来更方便了,加了GitHub链接
  • 正如您在此处看到的 -- github.com/drosenstark/SingletonInSwift -- 问题是每次调用 init 时,虽然它确实提供了相同的对象,但所有属性都设置为它们的初始分配(和willSet等在初始化期间没有运行)
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多