使用元类型值构造类类型“ClassName”的对象必须使用“必需”初始化程序 XCode8 Swift 3 更改
Posted
技术标签:
【中文标题】使用元类型值构造类类型“ClassName”的对象必须使用“必需”初始化程序 XCode8 Swift 3 更改【英文标题】:Constructing an object of class type 'ClassName' with a metatype value must use a 'required' initializer XCode8 Swift 3 changes 【发布时间】:2016-10-07 14:28:52 【问题描述】:由于 XCode 8 swift 3 更改,我正在努力解决这个特殊错误,并且无法在任何地方找到关于为什么会发生这种情况的详细解释。
错误:
使用元类型值构造类类型“PermissionScope”的对象必须使用“必需”初始化程序
在方法中:
public convenience init()
type(of: self).init(backgroundTapCancels: true)
任何帮助将不胜感激。
【问题讨论】:
重复***.com/a/32166077/611055 【参考方案1】:我认为这意味着您应该添加世界“必需”
class PermissionScope
required init(backgroundTapCancels : Bool)
【讨论】:
【参考方案2】:TomV, 我猜为什么下面的事情有效,是从 conv init 你必须调用指定的初始化程序。而且你不能直接从其他类调用 conv init 作为初始化程序。因此,您可能已从某个其他 init 方法从同一类调用此 conv init,因为 self 可用于调用进一步的 init。
【讨论】:
【参考方案3】:这个编译:
public convenience init()
self.init(backgroundTapCancels: true)
【讨论】:
convenience
初始化器旨在充当辅助初始化器,依次调用指定的初始化器,而另一种方法是用您自己的初始化器替换指定的初始化器。 useyourloaf.com/blog/adding-swift-convenience-initializers有一个很好的解释【参考方案4】:
self在实例方法和类方法上是不一样的,你可以通过Xcode的自动补全看到。在实例方法中,self的类型是SomeClass,而在类方法中,它的类型是SomeClass.Type。
编译器抱怨用元类型值构造类类型“SomeClass”的对象必须使用“必需”初始化程序
如何理解这个?如果我这样写一个子类。
在此处查看完整说明: http://blog.fujianjin6471.com/2015/08/31/why-does-constructing-an-object-with-a-metatype-need-a-required-initializer.html
【讨论】:
以上是关于使用元类型值构造类类型“ClassName”的对象必须使用“必需”初始化程序 XCode8 Swift 3 更改的主要内容,如果未能解决你的问题,请参考以下文章
定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型
GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )