Swift编译bug"未知类型名称"和"预期类型"

时间:2014-06-11 18:23:03

标签: ios swift

我遇到了一个问题,我的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使用时才会出现。

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

4 个答案:

答案 0 :(得分:10)

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

#import <Foundation/Foundation.h>

它没有:

#import <UIKit/UIKit.h>

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

注意:使用较新版本的Swift导入更容易输入,并且如下所示:

import UIKit

答案 1 :(得分:7)

如果您不想担心导入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. 除外
  3. 当您向Swift代码添加新的Objective-C类时,您不必在使用Swift代码的每个Objective-C文件中添加新的#import语句

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:1)

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