使用元类型值构造类类型“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 更改的主要内容,如果未能解决你的问题,请参考以下文章

java元注解 @Target注解用法

Delphi中避免使用ClassName判断对象的类型

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

GroovyMOP 元对象协议与元编程 ( 方法注入 | 使用 MetaClass 进行方法注入构造方法 )

C++类与对象第四篇:(初始化列表构造匿名对象隐式类型转换友元static成员内部类)

常见的构造函数类型