为什么我的Objective C模块会在Xcode 8中看到我的Swift 3类?

时间:2016-11-06 02:51:51

标签: objective-c swift3 xcode8

我几个月来一直在努力解决这个问题。我找到了很多答案,但到目前为止还没有一个对我有用。

我有一个有效的iOS应用程序已在商店里存放了好几年。它最初是用目标C编写的,然后我添加了一些Swift代码来利用该语言的功能。当我将项目转换为Xcode 8和Swift 3时,它创建了500多个错误,我不得不慢慢清除它们。最终我只得到了一类错误;客观C模块不能看到Swift类。

现在......我已经用@objc声明了,我甚至确保将这些类声明为public,以防万一。无论如何,这些事情应该是重要的,因为swift类是从NSObject派生的。

这是一个缩减示例;

@interface PDAppDelegate ()

@property (strong, nonatomic, readwrite) PDGameManager *gameManager;

@end


@implementation PDAppDelegate {
    NSString * stoppedMusicKey;
}

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [PDAward resetTutorial];
    return YES;
}

import Foundation
import CoreData

@objc class PDAward: NSManagedObject {

    @NSManaged var awardValue: Int16

    enum AwardType: Int16 {
        case Start = 0, Spin = 1, Water = 2, Treats = 3, Food = 4, Album = 5, Facebook = 101, Ball = 102, Name = 103, Gesture = 201, Weekly = 301, Stop = -1
    }

    var award: AwardType {
        get {
            return AwardType(rawValue: awardValue)!
        }
        set {
            awardValue = newValue.rawValue
        }
    }

    @objc class func resetTutorial() {
        // reset stuff
    }
}

当然,这已经大大削减了,但我希望我已经抓住了问题的所有要素。

让我强调一下我之前有过这段代码。为什么它现在不起作用?

2 个答案:

答案 0 :(得分:1)

  

我希望我已经捕获了问题的所有元素

你没有。最重要的是你省略的东西:Objective-C代码必须导入Swift头:

#import "MyModuleName-Swift.h"

答案 1 :(得分:1)

您需要包含一个头文件,以便您的Objective-C和Swift代码协同工作。而且您还必须将所有.h OBJ-C文件导入其中。

以下是一些可以帮助您的信息。 http://www.learnswiftonline.com/getting-started/adding-swift-bridging-header/