Почему мои модули Objective C не видят мои классы Swift 3 в Xcode 8?

Я боролся с этим уже несколько месяцев. Я нашел много ответов, но пока ни один из них не работал для меня.

У меня есть работающее iOS-приложение, которое пролежало в магазине несколько лет. Первоначально он был написан на языке Objective C, а затем я добавил немного кода Swift, чтобы использовать возможности языка. Когда я преобразовал проект в Xcode 8 и Swift 3, он создал более 500 ошибок, которые мне пришлось медленно отсеивать. В конце концов я дошел только до одного класса ошибок; Классы Swift не видны для объективных модулей C.

Теперь… я объявил с @objc, и я даже убедился, что классы были объявлены как общедоступные, на всякий случай. Эти вещи в любом случае должны были иметь значение, поскольку классы 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
    }
}

Конечно, это сильно урезано, но я надеюсь, что уловил все элементы проблемы.

Позвольте мне подчеркнуть, что этот код работал у меня раньше. Почему это не работает сейчас?


person Owen Godfrey    schedule 06.11.2016    source источник


Ответы (2)


Надеюсь, я уловил все элементы проблемы

У вас нет. Самое главное то, что вы пропустили: код Objective-C должен импортировать заголовок Swift:

#import "MyModuleName-Swift.h"
person matt    schedule 06.11.2016
comment
Однако обратите внимание, что если ваш код Swift по какой-либо причине не компилируется, заголовка Swift не будет, и вы получите сообщение об ошибке в операторе #import выше. Другими словами, ваши проблемы со Swift должны быть полностью устранены, прежде чем Objective-C сможет увидеть любой материал Swift. - person matt; 06.11.2016
comment
Я включил заголовок, но по какой-то причине в файловой системе уже был файл с именем PD-Swift.h, которого не было в проекте. Этот файл был найден при поиске файлов заголовков и не позволял найти сгенерированный файл заголовка. Это приводило к тому, что классы swift были невидимыми, но также делало невидимой и причину проблемы. Удалил ложный заголовочный файл, и все скомпилировалось. Ваше решение было не совсем точным, но, учитывая предоставленную мной информацию, оно было достаточно близко, чтобы оценить принятый ответ. - person Owen Godfrey; 07.11.2016

Вам нужно включить заголовочный файл, чтобы ваш код Objective-C и Swift работал вместе. И вы также должны импортировать в него все ваши файлы .h OBJ-C.

Вот еще немного информации, чтобы помочь вам. http://www.learnswiftonline.com/getting-started/adding-swift-bridging-header/

person Munib    schedule 06.11.2016
comment
Хорошо, спасибо за это. Вы, ребята, наставили меня на правильный путь. - person Owen Godfrey; 07.11.2016