Как использовать Objective-C #define от Swift
Я мигрирую a UIViewController класс, чтобы немного потренироваться со Свифтом. Я успешно использую код Objective-C через заголовок моста, но у меня есть необходимость импортировать файл констант, который содержит #define директивы.
Я видел в использование Swift с какао и Objective-C (простые макросы) следующие:
Простые Макросы
где вы обычно использовали
#defineдиректива для определения примитива константа в C и Objective-C, в Swift вместо этого используется глобальная константа. Например, определение константы#define FADE_ANIMATION_DURATION 0.35можно лучше выразить в Swift сlet FADE_ANIMATION_DURATION = 0.35. Поскольку простые константные макросы напрямую сопоставляются с глобальными переменными Swift, компилятор автоматически импортирует простые макросы, определенные в исходных файлах C и Objective-C.
так что, кажется, это возможно. Я импортировал файл, содержащий мои константы в заголовок моста, но у меня нет видимости из мой .swift файл, не может быть решена.
что я должен сделать, чтобы мои константы были видны Swift?
обновление:
это, кажется, работает с NSString константы, но не с логическими значениями:
#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift
#define kBOOL_CONSTANT YES // unresolved from swift
5 ответов:
на данный момент, какой
#defineпревращаются, а некоторые нет. Более конкретно:#define A 1...становится:
var A: CInt { get }или:
#define B @"b"...становится:
var B: String { get }к сожалению,
YESиNOне распознаются и не преобразуются на лету компилятором Swift.я предлагаю вам превратить вашу
#defines к фактическим константам, что лучше, чем#defines в любом случае..h:
extern NSString* const kSTRING_CONSTANT; extern const BOOL kBOOL_CONSTANT;.м
NSString* const kSTRING_CONSTANT = @"a_string_constant"; const BOOL kBOOL_CONSTANT = YES;и тогда Свифт увидите:
var kSTRING_CONSTANT: NSString! var kBOOL_CONSTANT: ObjCBoolдругой вариант-изменить ваш
BOOLопределяет#define kBOOL_CONSTANT 1быстрее. Но не так хорошо, как фактические константы.
просто быстрое разъяснение по нескольким вещам сверху.
Swift константы выражаются с помощью ключевого слова
letНапример:
let kStringConstant:String = "a_string_constant"кроме того, только в определении протокола можно использовать { get}, например:
protocol MyExampleProtocol { var B:String { get } }
в swift вы можете объявить перечисление, переменную или функцию вне любого класса или функции, и она будет доступна во всех ваших классах (глобально)(без необходимости импортировать определенный файл).
import Foundation import MapKit let kStringConstant:String = "monitoredRegions" class UserLocationData : NSObject { class func getAllMonitoredRegions()->[String]{ defaults.dictionaryForKey(kStringConstant) }
альтернативой для макроса может быть глобальная переменная . Мы можем объявить глобальную переменную вне класса и получить доступ к ним без использования класса. Пожалуйста, найдите пример ниже
импорт фундамент пусть BASE_URL = "www.google.com"
класс тест {
}
простой язык swift не требует макросов все #define директивы. будем пускать и сложные макросы должны преобразовываться в func
Comments