если я объявляю быструю константу как глобальную константу , например:
let a = "123"
но a
не может быть найден в объекте c.
Как это решить?
если я объявляю быструю константу как глобальную константу , например:
let a = "123"
но a
не может быть найден в объекте c.
Как это решить?
Из Apple Doc:
Вы будете иметь доступ ко всему внутри класса или протокола, помеченному атрибутом @objc, если оно совместимо с Objective-C. Это исключает функции Swift-only, такие как перечисленные здесь:
- Дженерики
- Кортеж
- Перечисления, определенные в Swift
- Структуры, определенные в Swift
- Функции верхнего уровня, определенные в Swift
- Глобальные переменные, определенные в Swift
- Typealiases определены в Swift
- Свифт в стиле вариа
- Вложенные типы
- Функции с карри
Поэтому невозможно получить доступ к глобальным переменным (константам) или глобальным функциям, определенным в Swift.
Возможные решения:
Из документа Apple Swift вы можете объявить свойства типа как
class var constant: Int = {
return 10
}()
Но в настоящее время в Swift (бета-3) свойства типа не поддерживаются.
Вы можете объявить функцию Class для получения постоянного значения:
В Swift:
class func myConst() -> String {
return "Your constant"
}
Доступ из Objective-C:
NSString *constantValue = [ClassName myConst];
NSLog(@"%@", constantValue);
Код Swift:
public class MyClass: NSObject {
public static let myConst = "aConst"
}
а затем в Objective-C:
[MyClass myConst]
Разве это не работает? Как это у меня работает.
Также это несколько короче, чем сначала создание объекта (alloc
, init
). Создание новой функции для каждой константы... не красиво:/
Из-за изменений в выводе Swift 4 Objective-C вам необходимо также добавить аннотацию @objc
к объявленной константе. Предыдущее объявление становится:
@objcMembers
public class MyClass: NSObject {
public static let myConst = "aConst"
}
Вызывающий код Objective-C остается прежним.
Использование
@objcMembers
делает доступными все константы (как если бы вы писали@objc
перед каждой константой), но у меня были случаи, когда компилятор как-то не генерировал соответствующий код ObjC.В этих случаях я бы предложил добавить декоратор
@objc
перед константой.
Т.е.:@objc public static let myConst = "aConst"
У вас не должно быть никаких проблем, используя let
в Objective-C, следующий пример был выполнен с Xcode 7.2:
MyClass.swift
import Foundation
import UIKit
@objc class MyClass : NSObject { // <== @objc AND NSObject ARE BOTH NECESSARY!!!
let my_color = UIColor( red:128/255,green:32/255,blue:64/255,alpha:1 ) // <== CONSTANT!!!
}
MyObjectiveC.m
#import "PROJECTNAME-Swift.h" // <== NECESSARY TO RECOGNIZE SWIFT CLASSES!!!
@interface MyObjectiveC ()
@end
@implementation MyObjectiveC
@synthesize tableview; // <== ANY UI OBJECT, JUST AS EXAMPLE!!!
- (void) viewDidLoad () {
MyClass * mc = [ [ MyClass alloc ] init ]; // <== INSTANTIATE SWIFT CLASS!!!
tableview.backgroundColor = mc.my_color; // <== USE THE CONSTANT!!!
}
@end
PROJECTNAME
- это название вашего проекта Xcode, как показано в Навигаторе проектов.
В вашем быстром классе
let constant: Float = -1
class YourClass: NSObject {
class func getMyConstant() -> Float {return constant}
...
}
Очистите, создайте, чтобы xcode подготовил этот метод, который можно использовать для obj-c. Затем в вашем классе obj-c
if ([YourClass getMyConstant] != 0) {
...
}
Прежде всего вам нужно знать о важном автогенерированном файле заголовка Swift.
Это то, что заставит магию расшифровать код Swift, чтобы быть понятным из Objective-C.
Этот файл автоматически генерируется Xcode ( не ищет его в вашем проекте).
Важным для этого файла является использование правильного имени, оно может совпадать с вашим целевым именем, но, возможно, оно не является именем модуля продукта. (Найдите его в настройках проекта как "Модуль продукта" )
Вам нужно импортировать этот файл в класс Objective-C, который должен использовать класс Swift , а также имя класса Swift вашего файла Swift.
#import <ProductModuleName-Swift.h>
@class MySwiftClassName;
Мой класс Swift должен иметь префикс @objc и наследовать от NSObject:
@objc class MySwiftClassName: NSObject {
let mySwiftVar = "123"
}
Затем вы можете вызвать переменную Swift из файла Objective-C:
MySwiftClassName *mySwiftClassO = [[MySwiftClassName alloc] init];
NSString *myVar = mySwiftClassO.mySwiftVar;
Обязательно очистить и перестроить ваш проект после каждого изменения, чтобы принудительно восстановить этот автоматически сгенерированный файл.
Если ваш заголовочный файл Swift был автоматически сгенерирован правильно, вы можете перейти к нему, щелкнув по имени файла импорта и проверить, правильно ли был переписан весь код.
В следующем посте вы можете найти более подробную информацию об этом. https://solidgeargroup.com/bridging-swift-objective-c
Классы не работают. Единственное решение, которое я обнаружил, это:
class YourController: NSObject {
@objc static let shared = YourController()
private override init() { }
@objc class func sharedInstance() -> YourController {
return YourController.shared
}
@objc let terms = "Your-String-here"
И затем в файле Obj-c:
[[YourController sharedInstance].terms]