web-dev-qa-db-ja.com

渡す方法Swift enum with @objc tag

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タグで列挙型を宣言して渡す方法ですか?

32
Dimillian

Swift列挙型はObj-C(またはC)列挙型とは非常に異なり、Obj-Cに直接渡すことはできません。

回避策として、Intパラメータを使用してメソッドを宣言できます。

_func newsCellDidSelectButton(cell: NewsCell, actionType: Int)
_

そして、それをNewsCellActionType.Vote.toRaw()として渡します。ただし、Obj-Cから列挙型名にアクセスすることはできず、コードがはるかに困難になります。

より良い解決策は、Obj-C(たとえば、ブライディングヘッダー)に列挙型を実装することです。これは、Swiftで自動的にアクセスでき、それをとして渡すことが可能になるためです。パラメータ。

編集

Obj-Cクラスで使用するためだけに_@objc_を追加する必要はありません。コードが純粋な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)
    }
}
_
7
Sulthan

Appleは本日、Swift 1.2(xcode 6.3に含まれる))がenumをobjective-cに公開することをサポートすることを発表しました

https://developer.Apple.com/Swift/blog/

enter image description here

49
Oren