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