2016-06-08 3 views
1

В Objective-C, это работало хорошо для Singleton in Interface BuilderИспользование Singleton в Interface Builder с Swift

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

Возможно ли это в Свифт? [Я застрял с моим решением, которое составляет here on Github.]

+1

Нет, потому что в Swift нет такой вещи, как 'alloc'. Вы управляете фундаментальным управлением памятью, и Swift не позволит вам это сделать. Если это важно для вас, почему бы не написать эту часть кода в Objective-C? – matt

+0

@matt Спасибо за это, согласился. Я пытаюсь представить гибрид, где singleton-ness находится в Objective-C, а затем «Вселенная» является подклассом Swift. Мне кажется, что это невозможно, поскольку «initialize» должен быть привязан к определенному классу, верно? –

+0

Нет, 'initialize' можно вызвать для подклассов. Вот почему хороший 'initialize' всегда проверяет, на каком классе это на самом деле. – matt

ответ

0

Это начало (я думаю). Суперкласс в Objective-C.

Пожалуйста, проверьте это на Github ... любая помощь оценена!

Singleton.h (должно быть в заголовке Bridging)

#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

Это довольно странно. «Инициализировать» вызывается ровно дважды (один раз для «Вселенной»), и все остальное кажется таким правильным! Не уверен, что случилось с моими «IBOutlets» ... в любом случае –

+0

Если вы действительно хотите «singleton», тогда у вас должен быть частный метод init, чтобы ничто другое не могло создать ваш экземпляр singleton. Вы также должны сделать класс окончательным. – Gargoyle

+0

Спасибо @Gargoyle, я сделаю это, как только у меня будет работа. –