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

Как передать быстрое перечисление с тегом @objc

Мне нужно определить протокол, который можно вызвать в классе, который использует некоторый тип Objective-c

Но выполнение этого не работает:

enum NewsCellActionType: Int {
    case Vote = 0
    case Comments
    case Time
}

@objc protocol NewsCellDelegate {
    func newsCellDidSelectButton(cell: NewsCell, actionType: NewsCellActionType)
}

Вы получите ошибку

Swift enums cannot be represented in Objective-C

Если я не помещаю тег @objc в свой протокол, это приведет к сбою приложения, как только он вызовет класс, который принимает протокол и наследует от класса типа Objective-c (например, UIViewController).

Итак, мой вопрос: как мне объявить и передать мое перечисление с тегом @objc?

4b9b3361

Ответ 1

Swift перечисления сильно отличаются от перечислений Obj-C (или C), и они не могут быть переданы непосредственно Obj-C.

В качестве обходного пути вы можете объявить свой метод с параметром Int.

func newsCellDidSelectButton(cell: NewsCell, actionType: Int)

и передать его как NewsCellActionType.Vote.toRaw(). Вы не сможете получить доступ к именам переименований из Obj-C, хотя это делает код намного сложнее.

Лучшим решением может быть реализация перечисления в Obj-C (например, в вашем заголовке), потому что тогда он будет автоматически доступен в Swift, и его можно будет передать как параметр.

ИЗМЕНИТЬ

Не нужно добавлять @objc просто, чтобы использовать его для класса Obj-C. Если ваш код является чистым Swift, вы можете использовать перечисления без проблем, см. Следующий пример в качестве доказательства:

enum NewsCellActionType : Int {
    case Vote = 0
    case Comments
    case Time
}

protocol NewsCellDelegate {
    func newsCellDidSelectButton(cell: UITableViewCell?, actionType: NewsCellActionType    )
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, NewsCellDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()

        test()

        return true;
    }

    func newsCellDidSelectButton(cell: UITableViewCell?, actionType: NewsCellActionType) {
        println(actionType.toRaw());
    }

    func test() {
        self.newsCellDidSelectButton(nil, actionType: NewsCellActionType.Vote)
    }
}

Ответ 2

Apple только что объявила сегодня, что Swift 1.2 (в комплекте с xcode 6.3) будет поддерживать выведение перечислений на objective-c

https://developer.apple.com/swift/blog/

enter image description here