关于单例类中定义的常量

时间:2018-10-01 19:34:32

标签: swift singleton

如果我在Swift 4中定义一个单例:

#import "XibViewHolder.h"

@implementation XibViewHolder

- (void)awakeFromNib
{
    [super awakeFromNib];
    [self xibSetup];
}

- (void)prepareForInterfaceBuilder
{
    [super prepareForInterfaceBuilder];
    [self xibSetup];
    [self.contentView prepareForInterfaceBuilder];
}

- (void)xibSetup
{
    if (_nibName == nil) { return; }
    UIView* loadedNibView = [self loadViewFromNib];
    loadedNibView.frame = self.bounds;
    loadedNibView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    [self addSubview:loadedNibView];
    self.contentView = loadedNibView;
}

- (UIView*)loadViewFromNib
{
    NSBundle* bundle = [NSBundle bundleForClass:[self class]];
    UINib* nib = [UINib nibWithNibName:_nibName bundle:bundle];
    return [nib instantiateWithOwner:self options:nil].firstObject;
}

@end

呼叫者可以通过public class MySingleton { static let shared = MySingleton() } 访问单例实例。

如果我在MySingleton.shared中添加一个常量字段school

MySingleton

呼叫者可以通过public class MySingleton { static let shared = MySingleton() let school = School() } 访问学校。如果所有呼叫者都通过这种方式访问​​MySingleton.shared.school,我的iOS应用程序中将只有school的一个实例吗?

3 个答案:

答案 0 :(得分:0)

为什么不为您的学校创建单身人士?

class School {
    static let shared = School()

    private init() { }

}

每次我打电话给MySingleton().school

时,学校的情况都会有所不同

答案 1 :(得分:0)

  

我是否正确,如果所有呼叫者都通过这种方式访问​​学校,那么我的iOS应用程序中将只有一个School实例吗?

理论上,也许吧。实际上,也许不是。问题在于school是一个实例属性。您说呼叫者可以MySingleton.shared.school —但问题是,他们可能没有。他们也可以说MySingleton().school。如果这样做,每个说出来的人都会有一个不同的School实例。

答案 2 :(得分:0)

如果所有呼叫者都以这种方式访问​​school并且没有创建其他实例,则它将是唯一的实例。

如果School是一个结构,那么任何将学校对象存储在另一个变量中的尝试都会有效地创建一个新实例。

例如:

var s = MySingleton.instance.school // where School is a struct.

在上文中,s在概念上与MySingleton.instance.school是不同的实例,更改其中一个将反映在另一个中。