gpt4 book ai didi

swift - 使 NSObject 子类的 init() 私有(private)

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:33 25 4
gpt4 key购买 nike

FooClass 应该只允许通过其 sharedInstance 进行交互。我试图通过不允许任何人访问 FooClassinit() 来防止滥用。

我尝试了几种不同的方法,但都不起作用:

使用私有(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com