swift – 使init()为NSObject子类私有
发布时间:2020-12-14 04:46:04 所属栏目:百科 来源:网络整理
导读:类FooClass应该只允许通过其sharedInstance进行交互.我试图通过不允许任何人访问FooClass的init()来防止滥用. 我尝试了一些不同的方法,但都没有工作: 使用私人关键字: class FooClass: NSObject { // singleton static let sharedInstance = FooClass() le
类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 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 解决方法
这个答案解决了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 here FooClass* foo2 = [[FooClass alloc] init]; // 'init' is unavailable FooClass* foo3 = [FooClass new]; // 'new' is unavailable 我这里有一个基本的示例项目:SharedInstance project git (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |