Подтвердить что ты не робот

Как объявить константу в быстрой, которая может быть использована в объективе c

если я объявляю быструю константу как глобальную константу , например:

let a = "123"

но a не может быть найден в объекте c.

Как это решить?

4b9b3361

Ответ 1

Из Apple Doc:

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

  1. Дженерики
  2. Кортеж
  3. Перечисления, определенные в Swift
  4. Структуры, определенные в Swift
  5. Функции верхнего уровня, определенные в Swift
  6. Глобальные переменные, определенные в Swift
  7. Typealiases определены в Swift
  8. Свифт в стиле вариа
  9. Вложенные типы
  10. Функции с карри

Поэтому невозможно получить доступ к глобальным переменным (константам) или глобальным функциям, определенным в Swift.

Возможные решения:

  1. Из документа Apple Swift вы можете объявить свойства типа как

    class var constant: Int =  {
        return 10
    }()
    

    Но в настоящее время в Swift (бета-3) свойства типа не поддерживаются.

  2. Вы можете объявить функцию Class для получения постоянного значения:

    В Swift:

    class func myConst() -> String {
    
        return "Your constant"
    }
    

Доступ из Objective-C:

 NSString *constantValue = [ClassName myConst];
 NSLog(@"%@", constantValue);

Ответ 2

Код Swift:

public class MyClass: NSObject {
    public static let myConst = "aConst"
}

а затем в Objective-C:

[MyClass myConst]

Разве это не работает? Как это у меня работает.

Также это несколько короче, чем сначала создание объекта (alloc, init). Создание новой функции для каждой константы... не красиво:/

Обновление для Swift 4

Из-за изменений в выводе 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"

Ответ 3

У вас не должно быть никаких проблем, используя 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, как показано в Навигаторе проектов.

Ответ 4

В вашем быстром классе

let constant: Float = -1
class YourClass: NSObject {
class func getMyConstant() -> Float {return constant}
...
}

Очистите, создайте, чтобы xcode подготовил этот метод, который можно использовать для obj-c. Затем в вашем классе obj-c

if ([YourClass getMyConstant] != 0) {
...
}

Ответ 5

Прежде всего вам нужно знать о важном автогенерированном файле заголовка 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

Ответ 6

Классы не работают. Единственное решение, которое я обнаружил, это:

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]