类 FooClass
应该只允许通过其 sharedInstance
进行交互。我试图通过不允许任何人访问 FooClass
的 init()
来防止滥用。
我尝试了几种不同的方法,但都不起作用:
使用私有(private)关键字:
class FooClass: NSObject {
// singleton
static let sharedInstance = FooClass()
let value: String
private override init() {
self.value = "asdf"
}
}
// this should be a compile error, but it is not
let foo = FooClass()
使用@available:
class FooClass: NSObject {
// singleton
// COMPILE ERROR - "init is unavailable. use sharedInstance"
static let sharedInstance = FooClass()
let value: String
@available(*, unavailable, message="use sharedInstance")
override init() {
self.value = "asdf"
}
}
// COMPILE ERROR - as it should be
let foo = FooClass()
我也试过使用 internal,但还是不行。
更新
如果您将它移动到它自己的文件中,第一个版本可以工作,但是该类的 ObjC 版本仍然允许调用 init。有什么想法吗?
SWIFT_CLASS("_TtC11SwiftToObjC8FooClass")
@interface FooClass : NSObject
+ (FooClass * __nonnull)sharedInstance;
@property (nonatomic, readonly, copy) NSString * __nonnull value;
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
@end
最佳答案
你可以使用@available()
注解:
@available(*, unavailable, message: "Use __your_init__ instead")
override init() {
fatalError("init() has not been implemented")
}
关于swift - 使 NSObject 子类的 init() 私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166662/