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

标签 swift

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/

相关文章:

swift - 如何以编程方式移动 ARAnchor?

ios - 将端点解析为用户名/密码

Swift 3 全局函数。我可以这样做吗?

arrays - Swift 中的 TableView 搜索

swift - 在不存储单个值的情况下计算平均值的方法

ios - 在 iOS10 中更改 UIDatePicker TextColor

swift - 如何在 Swift 中从字符串创建类的实例

ios - 访问 UIAlertController 的文本字段 - swift ios8

ios - 我想要导航栏中后退按钮的自定义图像,但有 2 个后退按钮

swift - 将前导零添加到将与文本一起打印在字符串中的数字