我从 Swift 编译器收到一条奇怪的错误消息:
<unknown>:0: error: 'required' initializer 'init(arrayLiteral:)' must be provided by subclass of 'NSSet'
Foundation.NSSet:2:33: note: 'required' initializer is declared in superclass here
required public convenience init(arrayLiteral elements: Any...)
^
请注意,我的所有代码都不是NSSet
(也不是Set
)的子类。所以我根本不知道为什么 Swift 会认为我这样做了,更不用说我做错了。
我的项目有点特别,因为我有调用 C++ 代码(通过 Objective-C)的 Objective-C 类和一个让 Swift 调用 C 库的 module.map
文件。
错误发生在编译 Swift 文件时(我从几个 Swift 文件中得到它,但只有一些使用 C 库,但到目前为止它们似乎都在与 ObjC 类对话)。如您所见,Swift 没有针对其错误的行号,但有人正在对 NSSet 进行子类化。
有人看过吗?有谁知道如何诊断这个问题?我尝试注释掉部分代码,但我似乎找不到任何有助于追踪此问题的信息。
强调:我没有对 NSSet 进行任何子类化。我想我什至没有在我的代码中使用 NSSet。这似乎是 Swift 编译器正在弥补的东西。
更新: Another question让我想到它可能与从 Class
对象实例化实例有关。我有一个类,它有一个 Class
,稍后我想实例化它:
@interface MYInfo : NSObject
@property Class myClass;
@end
稍后我使用 Swift 中的它来实例化它:
guard let myClass = info.myClass.init() as? MyClass else { return }
如果我删除最后一行,错误消息就会消失。
最佳答案
所以想通了,多亏了另一个问题(尽管这是完全不同的):
当您尝试初始化一个类型为 ObjC 的
Class
类型的变量并出现误导性错误时,Swift 编译器真的很愚蠢'required' initializer 'init(arrayLiteral:)' must由“NSSet”的子类提供
,即使不涉及 NSSet。我猜 NSSet 是它知道的第一个或最后一个 ObjC init 方法之类的。Swift 编译器还会在随机 源文件(甚至是空文件!)上显示此错误,因为 Swift 解析项目中所有其他文件的“神奇”方式,因此您可以引用它们中的类没有像 C 那样的
include
语句。实例化
Class
的正确方法是首先对其进行类型转换:
guard let myClass = info.myClass as? (NSObject & MyClass).Type else { return }
let myInstance = myClass.init()
这比原本应该更难弄清楚。
关于ios - Swift 认为我错误地继承了 NSSet 但我根本没有继承它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55831682/