Быстрые глобалы и глобальные функции в объективе c

В документации написано:

Глобальные константы, определенные в исходных файлах C и Objective-C, автоматически импортируются компилятором Swift как глобальные константы Swift.

Но он ничего не говорит о другом. Мне нужно определить глобальную быструю константу и уметь видеть ее как цель c, как глобальную константу c. Как на быстрой стороне определите:

public let CARDS = ["card1", "card2"]

и посмотрите, как использовать его на стороне цели c, например

NSLog(@"Cards count: %d", [CARDS count])

Что мне делать? Я уже импортировал быстрый автоматически сгенерированный заголовок, например:

#import "MyProject-Swift.h"

и в Xcode, если я command-click на нем, он возвращает меня в нужное место в быстром коде, но во время компиляции я получаю:

'User of undeclared Identifier CARDS'

на моей стороне цели c.

Ответ 1

Вот документ об этом

У вас есть доступ к чему-либо в классе или протоколе, который отмеченный атрибутом @objc, если он совместим с Objective-C. Это исключает функции Swift, такие как перечисленные здесь:

  • Дженерики
  • кортежи
  • Перечисления, определенные в Swift
  • Структуры, определенные в Swift
  • Функции верхнего уровня, определенные в Swift
  • Глобальные переменные, определенные в Swift
  • Типизации, определенные в Swift
  • Варианты стиля Swift
  • Вложенные типы
  • Выполненные функции

Глобальные переменные (включая константы) недоступны из Objective-C.

Вместо этого вы должны объявить класс, который имеет accessors для глобальных констант.

// Swift
public let CARDS = ["card1", "card2"]

@objc class AppConstant {
   private init() {}
   class func cards() -> [String] { return CARDS }
}

// Objective-C
NSArray *cards = [AppConstant cards];

Ответ 2

Хороший ответ от @rintaro, но другой альтернативный простой ответ Swift для констант, который можно использовать как в Swift, так и в Objective-C:

@objcMembers
class MyConstants: NSObject {
    static let kMyConstant1 = "ConstantValue1";
    static let kMyConstant2 = "ConstantValue2";
}

Вы можете получить к нему доступ как в Swift, так и в Objective-C:

MyConstants.kMyConstant1 // this will return "ConstantValue1"