Swift认为我错误地继承了NSSet,但我根本没有对它进行子类化

问题描述 投票:6回答:1

我从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)。所以我不知道为什么斯威夫特认为我在做这件事,更不用说错误了。

我的项目有点特别之处在于我有Objective-C类调用C ++代码(通过Objective-C)和一个module.map文件让Swift调用C库。

编译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 }

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

ios objective-c swift objective-c++ swift5
1个回答
5
投票

所以想通了,这要归功于其他问题(虽然这是完全不同的):

  1. 当您尝试初始化一个类型为ObjC的Class类型的变量时,Swift编译器真的很愚蠢,并且即使不涉及NSSet也会出现误导性错误'required' initializer 'init(arrayLiteral:)' must be provided by subclass of '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()

这比想象的要难得多。

© www.soinside.com 2019 - 2024. All rights reserved.