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タグで列挙型を宣言して渡す方法ですか?
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)
}
}
_
Appleは本日、Swift 1.2(xcode 6.3に含まれる))がenumをobjective-cに公開することをサポートすることを発表しました