大佬教程收集整理的这篇文章主要介绍了swift – 使init()为NSObject子类私有,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试了一些不同的方法,但都没有工作:
使用私人关键字:
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()
我也试过使用内部,但仍然没有运气.
如果将第一个版本移动到自己的文件,则第一个版本可以工作,但是该类的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
只要将类放入自己的文件中,您的第一种方法就会起作用.访问控制关键字private表示定义的@L_616_14@仅在包含文件中可用.
但是,如您所说,在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" } }
@interface FooClass (SharedInstancE) + (instanCETypE) new NS_UNAVAILABLE; - (instanCETypE) init NS_UNAVAILABLE; @end
您还必须阻止new,因为@R_268_7724@,则可以通过它创建类的实例.
测试:
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
以上是大佬教程为你收集整理的swift – 使init()为NSObject子类私有全部内容,希望文章能够帮你解决swift – 使init()为NSObject子类私有所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。