У меня есть фрагмент кода, который хорошо работает с объявлением класса и объявлением строки, но я хотел бы сохранить код, зная способ преобразования объявления имени класса в строку. Вот пример, который работает:
#define FORM_TO_USE RegistrationForm_Renault_Sport
#define FORM_TO_USE_SWIFT @"RegistrationForm_Renault_Sport"
Но мне нужно что-то более общее, например:
#define FORM_TO_USE RegistrationForm_Renault_Sport
#define FORM_TO_USE_SWIFT [NSString stringWithFormat:@"%@",FORM_TO_USE]
или же
#define FORM_TO_USE RegistrationForm_Renault_Sport
#define FORM_TO_USE_SWIFT String(FORM_TO_USE)
Но эти два последних примера не работают.
Моя цель - быстро использовать это:
let anyobjectype : AnyObject.Type = NSClassFromString(FORM_TO_USE_SWIFT)!
let nsobjectype : NSObject.Type = anyobjectype as! NSObject.Type
let fieldsObjC: AnyObject = nsobjectype.init()
Это имя класса. Я не могу использовать его напрямую с swift, но если я использую в swift, NSClassFromString (FORM_TO_USE_SWIFT) со строкой внутри, он работает.
@ ΩlostA куда ты ставишь эти строки #define? Находятся ли они в файле Objective-C?
@trungduc да точно, он находится в моем файле с объектом Constants.h
На самом деле, я не знаю, зачем вам нужно определять строку в объекте-c и использовать ее быстро. Вы можете объяснить? Возможно, я могу помочь тебе
@trungduc Потому что 80% моего кода соответствует цели C, и мне нужно перейти на быстрый переход, но это займет много времени. Я не хочу, чтобы два кода были похожи на двух разных сторонах, особенно с моим большим файлом constant.h ...





Мое решение - создать метод класса Objective-C для каждого макроса #define, который вернул значение макроса. Например.
Constants.h
#define FORM_TO_USE RegistrationForm_Renault_Sport
#define FORM_TO_USE_SWIFT [NSString stringWithFormat:@"%@",FORM_TO_USE]
@interface Constants : NSObject
+ (NSString *)formToUseSwift;
@end
Constants.m
@implementation Constants
+ (NSString *)formToUseSwift {
return FORM_TO_USE_SWIFT;
}
@end
Swift файл
let anyobjectype : AnyObject.Type = NSClassFromString(Constants.formToUseSwift())!
let nsobjectype : NSObject.Type = anyobjectype as! NSObject.Type
let fieldsObjC: AnyObject = nsobjectype.init()
На мой взгляд, это единственно возможный способ избежать совпадения двух кодов с двух разных сторон.
Образец
https://github.com/trungducc/stackoverflow/tree/swift-constant-from-objective-c
@ trungduc У меня проблема, сообщение об ошибке «Использование необъявленного идентификатора RegistrationForm_Renault_Sport» => при возврате FORM_TO_USE_SWIFT;
Измените свой вопрос, указав соответствующий код ошибки. Я тебе помогу.
Извините, но что такое RegistrationForm_Renault_Sport в вашем коде?
Это имя класса. Я использую это в своем коде таким образом: FORM_TO_USE * form = ...
Давай попробуем #define FORM_TO_USE @"RegistrationForm_Renault_Sport"
Проблема в том, что я не мог использовать это в своем коде таким образом: FORM_TO_USE * form = [FORM_TO_USE new]; ...
Получил. Попробуйте еще раз #define FORM_TO_USE_SWIFT NSStringFromClass(FORM_TO_USE.class)
Буду проверять на своей стороне, большое спасибо за время, проведенное со мной: D
Добро пожаловать ;). Не стесняйтесь спрашивать меня, нужна ли вам моя помощь.
что такое RegistrationForm_Renault_Sport?