Sto lavorando su una base di codice grande esistente che è prevalentemente Objective-C ma è in fase di conversione in Swift.Importazione circolare Swift/ObjC
Nuove classi vengono implementate in Swift, ma alcune di queste classi devono essere accessibili dal codice ObjC esistente. Nel tentativo di seguire le best practice di ObjC e Swift, le nuove classi non hanno un prefisso, ma sono definite con un prefisso per ObjC.
/**
Create contrived class that is named XXClassA in ObjC and ClassA in Swift.
*/
@objc(XXClassA) class ClassA: NSObject {
let foo = "bar"
}
Finora questo ha funzionato alla grande; Il codice Swift utilizza ClassA()
e ObjC utilizza [[XXClassA alloc] init]
. Una volta rimosso tutto il codice ObjC che fa riferimento a XXClassA, è possibile rimuovere @objc(XXClassA)
dalla classe Swift.
Sfortunatamente ciò si interrompe se si dispone di una classe ObjC di riferimento XXClassA e quindi il codice Swift tenta di utilizzare quella nuova classe all'interno di ClassA.
dire che mi creo una classe objC, denominata XXClassC
ed esso stesso crea un'istanza utilizzando un XXClassA
(che in realtà è la classe Swift ClassA
)
//
// XXClassC.h
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class XXClassA;
@interface XXClassC : NSObject
-(instancetype)initWithA:(XXClassA *)classA;
@end
NS_ASSUME_NONNULL_END
Il riferimento circolare è ora in atto. Se tento di utilizzare XXClassC dall'interno di ClassA, l'inizializzatore non è disponibile.
Se io ridefinire ClasseA come questo, invece, tutto è di nuovo bene.
class XXClassA: NSObject {
let foo = "bar"
}
capisco perché questo sta accadendo e la correzione che ho in luogo, ma voglio continuare a utilizzare questo modello di classi objc prefissati. Qualche idea su come evitare l'importazione circolare, ma anche mantenere la convenzione di denominazione?
codice di esempio completo qui: https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38