Как использовать 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 {

}