Защо моите Objective C модули не виждат моите Swift 3 класове в Xcode 8?

От месеци се боря с това. Намерих много отговори, но досега нито един не ми помогна.

Имам работещо приложение за iOS, което е в магазина от няколко години. Първоначално беше написан на object 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 във файловата система, който не беше в проекта. Този файл се намираше при търсенето на заглавните файлове и предотвратяваше намирането на генерирания заглавен файл. Това караше бързите класове да бъдат невидими, но също така правеше невидима и причината за проблема. Изтрих фалшивия заглавен файл и всичко беше компилирано. Вашето решение не беше съвсем на ниво, но като се има предвид информацията, която предоставих, беше достатъчно близо, за да оцените Приет отговор. - 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