protocolにoptionalな関数を加えたい場合、@objcを書き加える必要がある。
@objc protocol Hoge {
optional func hogehoge()
}
@objcがない場合、 'optional' can only be applied to members of an @objc protocol といったコンパイルエラーが発生する。
しかし、@objcをつけたプロトコル内部では、クラス型のみが記述できる。
したがって、structやenumは@objcプロトコル内に記述できない。
enum Piyo {
}
@objc protocol Hoge {
// コンパイルエラー "Method cannnot be marked @objc because the type of the parameter cannnot be represented in Objective-C"
optional func hogehoge(piyo: Piyo)
}