swift – 使init()为NSObject子类私有

swift – 使init()为NSObject子类私有,第1张

概述类FooClass应该只允许通过其sharedInstance进行交互.我试图通过不允许任何人访问FooClass的init()来防止滥用. 我尝试了一些不同的方法,但都没有工作: 使用私人关键字: class FooClass: NSObject { // singleton static let sharedInstance = FooClass() let valu 类FooClass应该只允许通过其sharedInstance进行交互.我试图通过不允许任何人访问FooClass的init()来防止滥用.

我尝试了一些不同的方法,但都没有工作:

使用私人关键字:

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 notlet 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 belet 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
解决方法 这个答案解决了Swift 2.在Swift 3中,看起来方法的访问级别从Swift正确导入到Objective-C,并且不需要标记为NS_UNAVAILABLE以禁止它可用.当然,Swift中没有新方法,因此仍需要将其标记为NS_UNAVAILABLE以正确维护单例.

只要将类放入自己的文件中,您的第一种方法就会起作用.访问控制关键字private表示定义的功能仅在包含文件中可用.

但是,如您所说,在Objective-C中使用Swift类将删除私有程序给您的保护.我相信这是因为标记为private的任何内容都不会在编译器生成的导入头文件中有条目.因此,从NSObject继承的init函数是可用的,因为它没有被重写.

我找到的解决方案是创建另一个头文件,显式声明一个无法调用的init函数.

Swift课程:

@objc(FooClass)class FooClass: NSObject {  // singleton  static let sharedInstance = FooClass()  let value: String  private overrIDe init() {    self.value = "asdf"  }}

Objective-C标题:

@interface FooClass (SharedInstance)+ (instancetype) new  NS_UNAVAILABLE;- (instancetype) init NS_UNAVAILABLE;@end

您还必须阻止new,因为如果不这样做,则可以通过它创建类的实例.

测试:

FooClass* foo  = [FooClass sharedInstance]; // All good hereFooClass* foo2 = [[FooClass alloc] init];   // 'init' is unavailableFooClass* foo3 = [FooClass new];            // 'new' is unavailable

我这里有一个基本的示例项目:SharedInstance project git

总结

以上是内存溢出为你收集整理的swift – 使init()为NSObject子类私有全部内容,希望文章能够帮你解决swift – 使init()为NSObject子类私有所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1008774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存