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

Может ли objective-c быстрый вызов кода для быстрого вызова класса?

Я искал некоторые сообщения, я думаю, что не могу написать расширение под swift и называть его кодом Objective-C, правильно?

@objc как атрибуты поддерживают только методы, класс, протоколы?

4b9b3361

Ответ 1

Вы можете написать расширение Swift и использовать его в коде ObjectiveC. Протестировано с помощью XCode 6.1.1.

Все, что вам нужно сделать, это:

  • создайте расширение в Swift (аннотация @objc)

  • импортировать "ProjectTarget-Swift.h" в ваш класс ObjectiveC (где "ProjectTarget" представляет цель XCode, с которой связано расширение Swift)

  • вызовите методы из расширения Swift

Ответ 2

Это решение работает для Swift 2.2 и Swift 3. Обратите внимание, что только расширения для классов (не для структур или перечислений) будут доступны из Objective-C.

import UIKit

extension UIColor {

    //Custom colours
    class func otheEventColor() -> UIColor {
        return UIColor(red:0.525, green:0.49, blue:0.929, alpha:1)
    }
}

Затем #import "ProductModuleName-Swift.h" в вашем файле ObjC.

Ответ 3

Как описано в других ответах, импорт сгенерированного заголовка Swift работает в большинстве случаев.

Исключением является то, что категория определена по мостовому типу (т.е. расширение определено на String, а не NSString). Эти категории автоматически не будут подключены к их партнерам Objective-C. Чтобы обойти это, вам нужно будет использовать тип Objective-C (и введите возвращаемое значение в код Swift с помощью as String) или укажите расширение для типов Swift и Objective-C.

Ответ 4

Я узнал, что в Swift 4.0 мне пришлось добавить @objc перед моим расширением, чтобы методы расширения Swift стали видимыми экземпляром класса Objc я расширялся.

Короче:

Настройка конфигурации файла:

CustomClass.h
CustomClass.m
CustomClassExtension.swift

В CustomClassExtension:

@objc extension CustomClass
{
    func method1() 
    {
        ...
    }
}

В моем AppDelegate.m:

self.customClass = [[CustomClass alloc] init];
[self.customClass method1];