【问题标题】:Swift compiling bug "Unknown type name" and "Expected a type"Swift 编译错误“未知类型名称”和“预期类型”
【发布时间】:2017-09-07 04:58:41
【问题描述】:

我遇到了一个问题,我的 Swift 代码编译得很好,但是生成的 -Swift.h 文件中有一个错误...

这是我正在做的一个例子:

class MyScene : CCLayer {
    var ctrl : CCControlSlider?
}

这在 swift 代码中编译得很好,我也可以看到 ctrl 对象上的方法也很好。我的桥头中有以下内容:

#import "cocos2d.h"
#import "CCControlSlider.h"

这在使用其他正常工作的库的其他类中工作得很好。另请注意,我可以在我的 Objective-C 类中使用这个 CCControlSlider 类,完全没有问题。

生成的 -Swift.h 文件如下所示:

SWIFT_CLASS("_TtC15MyProject10MyScene")
@interface MyScene : CCLayer
@property (nonatomic) CCControlSlider * ctrl;
@end

该属性有错误“未知类型名称“CCControlSlider”,如果在方法中使用它,则会给出错误“预期类型”。

这在使用其他类时工作得很好,但是由于某种原因,这个类只在生成的头文件中并且仅在从 Swift 中使用时才会出现此编译器错误。

我想我想知道的是,我做错了什么还是这只是一个错误??

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    在将一组 Objective C 文件合并到我主要基于 Swift 的项目中时,我突然开始在它们上遇到很多这样的错误。然后我意识到虽然文件有:

    #import <Foundation/Foundation.h>
    

    它没有:

    #import <UIKit/UIKit.h>
    

    一旦我添加了该行,错误就开始解决。事后清洁总是有帮助的。祝你好运

    注意:使用较新版本的 Swift 导入更容易键入,并且可以这样完成:

    import UIKit
    

    【讨论】:

    • 好一个,我自己永远不会想到我还需要比我想导入的类“更高”的导入。谢谢老兄,帮我节省了一个小时
    【解决方案2】:

    如果您不想担心导入 ProjectName-Swift.h 文件的所有位置的导入顺序,请尝试以下操作:

    创建一个名为ProjectName-Swift-Fixed.h的文件,内容如下

    // ProjectName-Swift-Fixed.h
    @class CCControlSlider;
    // (Add other imports or forward declarations here)
    #import "ProjectName-Swift.h"
    

    其次,在您的其余代码库中,将 #import "ProjectName-Swift.h" 替换为 #import "ProjectName-Swift-Fixed.h"

    与在 Objective-C 代码中使用 Swift 类的每个位置上方复制和粘贴 #import 语句列表相比,这种方法有两个好处:

    1. 您不必担心导入的顺序,ProjectName-Swift-Fixed.h 文件除外
    2. 向 Swift 代码添加新的 Objective-C 类时,您不必在每个使用 Swift 代码的 Objective-C 文件中添加新的 #import 语句

    【讨论】:

      【解决方案3】:

      这里给出的答案是最简单的方法:https://stackoverflow.com/a/24216718/341994

      基本上,在您的 Objective-C 代码的某处,您正在导入自动生成的 -Swift.h 标头。在同一代码中,#import 行之前,插入#import "CCControlSlider.h"。这两个#import 语句的顺序至关重要!

      这个 Objective-C 类可能不需要 CCControlSlider 的事实是无关紧要的(尽管如果它需要,那是一个奖励)。重要的是顺序。在将命名空间暴露给自动生成的-Swift.h 标头之前,我们希望将命名空间暴露给 CCControlSlider。

      【讨论】:

      • 这是否是一个错误?我希望自动生成的 -Swift 文件可以访问桥接头中的所有内容?
      • ProjectName-Swift.h 文件是 XCode 自动生成的,你只需要在 .m 文件中导入即可: #import 当然,-Swift.h 文件和 - Bridging-Header.h,如果您将 Swift 添加到 Objective-C,则两者都是必需的。
      【解决方案4】:

      OC代码有一个全局调用#import "projectName - swift.h",和"the projectName - Bridging - Header.h"并调用OC代码。相当于父类调用子类,子类调用超类.要使“projectName - Bridging - Header.H”调用oc类不要调用#import“projectName - swift.H.

      【讨论】:

        猜你喜欢
        • 2014-04-17
        • 1970-01-01
        • 2012-02-20
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多