在Objective-C中,只需将-init
方法引用为状态singleton变量就可以创建一个没有 sharedInstance 或类似类调用的单例,就像这样
static MyObject *sharedObject;
/*
* The init will return the actual singleton instance if called directly.
* The first time called it will create it and intialize it.
*/
- (instancetype)init
{
static dispatch_once_t once;
dispatch_once(&once, ^{
id myself = [super init];
if (nil != myself) {
[self initialize];
sharedObject = myself;
}
});
return sharedObject;
}
因此,用户可以根据需要多次调用此MyObject *myObject = [[MyObject alloc] init];
,并且每次都会返回相同的对象。但从语法来看,这显然不是一个单身人士。
我试图在Swift中获得类似的功能,我每次都可以返回相同的对象(一个NSObject子类)但是它显然不是一个单例。
我会称之为var myObject = MyObject()
或者如上所述桥接到Objective-C,但它们都会引用相同的对象。
我熟悉Swift中单例的正常 sharedInstance 方法。
有关如何执行此操作的建议将不胜感激。
这与Swift答案中的dispatch_once不同,因为它仍使用 sharedInstance
答案 0 :(得分:1)
我认为你可以使用Objective-C的相关对象做类似于你正在寻找的东西。您可以在此处查看有关如何在Swift中使用它的博文:http://en.swifter.tips/associated-object/
我并非真正理解这一点的目的,但我必须 - 我认为可取使单身看起来就像一个单身人士。
您可以在技术上使用这些关联对象来创建一个始终返回相同关联对象的函数,例如func giveMeTheSameObjectEveryTime() -> AssociatedObjectType
,其语法与init() -> AssociatedObjectType
类似,但我认为您是'因为你必须创建一些样板变量来保持关联,这对单例产生类似的影响,这比简单的static let sharedInstance
属性要多得多。
答案 1 :(得分:1)
在Objective-C中,初始化就像在实例
上调用的任何其他方法一样 [[alloc SomeClass] init]
您首先alloc
一个实例,然后显式调用其初始化。
init
能够返回任何对象;返回self
只是一种在特殊情况下可以忽略的约定,例如您显示的约定。
在Swift中,init
很特别。作为分配
let x = SomeClass()
Swift init
隐式返回self
(或者在可失败的初始化者的情况下,它可以返回nil
)。因此,您无法通过返回其他对象来实现Swift中的“隐藏单例”。