Swift编译bug"Unknown type name"和"Expected a type"

Tri*_*Man 12 ios swift

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

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

class MyScene : CCLayer {
    var ctrl : CCControlSlider?
}
Run Code Online (Sandbox Code Playgroud)

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

#import "cocos2d.h"
#import "CCControlSlider.h"
Run Code Online (Sandbox Code Playgroud)

这在使用其他正常工作的库的其他类中完全正常.另请注意,我可以在Objective-c类中使用此CCControlSlider类,也没有任何问题.

以下是生成的-Swift.h文件中发生的情况:

SWIFT_CLASS("_TtC15MyProject10MyScene")
@interface MyScene : CCLayer
@property (nonatomic) CCControlSlider * ctrl;
@end
Run Code Online (Sandbox Code Playgroud)

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

这可以很好地使用其他类,但由于某种原因,这一个类只在生成的头文件中提供此编译器错误,并且仅在从Swift使用时.

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

Col*_*ris 10

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

#import <Foundation/Foundation.h>
Run Code Online (Sandbox Code Playgroud)

它没有:

#import <UIKit/UIKit.h>
Run Code Online (Sandbox Code Playgroud)

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

注意:使用较新版本的Swift导入更容易键入并完成如下操作:

import UIKit
Run Code Online (Sandbox Code Playgroud)


joh*_*les 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"
Run Code Online (Sandbox Code Playgroud)

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

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

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


mat*_*att 5

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

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

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