ios - Swift 认为我错误地继承了 NSSet 但我根本没有继承它

标签 ios objective-c swift objective-c++ swift5

我从 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 }

如果我删除最后一行,错误消息就会消失。

最佳答案

所以想通了,多亏了另一个问题(尽管这是完全不同的):

  1. 当您尝试初始化一个类型为 ObjC 的 Class 类型的变量并出现误导性错误时,Swift 编译器真的很愚蠢 'required' initializer 'init(arrayLiteral:)' must由“NSSet”的子类提供,即使不涉及 NSSet。我猜 NSSet 是它知道的第一个或最后一个 ObjC init 方法之类的。

  2. Swift 编译器还会在随机 源文件(甚至是空文件!)上显示此错误,因为 Swift 解析项目中所有其他文件的“神奇”方式,因此您可以引用它们中的类没有像 C 那样的 include 语句。

  3. 实例化 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/

相关文章:

ios - 将数据传递给 TabBar Controller

ios - `returningItems` 中 `NSExtensionContext.completeRequest` 的用途是什么?

iphone - 是否可以以编程方式反转图像的颜色?

ios - 使用AVQueuePlayer时无声音

iphone - iOS中是否有用于比较两个日期的任何特定格式?

ios - fatal error : unexpectedly found nil while unwrapping an Optional value in Swift

ios - 推送新 View Controller 后 UITabBar 消失

ios - Xcode 7 中的单元测试崩溃

ios - Objective-C - 在验证数据时使用 subview 阻止触摸或手势

ios - 如何使用swift加载原生专辑视频