班上FooClass
应该只允许通过其交互sharedInstance
。我试图通过不允许任何人访问来防止滥用init()
of FooClass
.
我尝试了几种不同的方法,但没有一个有效:
使用私有关键字:
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()
我也尝试过使用内部,但仍然没有运气。
UPDATE
如果将第一个版本移至其自己的文件,则该版本可以工作,但是该类的 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")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)