Help us understand the problem. What is going on with this article?

Swift で `Method cannot be marked @objc because its result type cannot be represented in Objective-C` が出るもクラスの定義がライブラリ内なとき

More than 1 year has passed since last update.

swift 4

課題

https://stackoverflow.com/questions/49552501/method-cannot-be-marked-objc-because-its-result-type-cannot-be-represented-in-o

とかにあるように、 @objc 修飾子をつけた場合、定義されているクラスは Objective-C から見られるよう NSObject を継承しなければならない

が、この例でいう User が、自分が定義しているクラスじゃないときは、

class User: NSObject

と書くことは当然できない。

解決策(の一例)

方針としては、

  • objc 修飾子をつけたい func では、 Objective-C で解決できるようなものを指定する
  • 必要であれば、 Swift 側で、それを適切に戻してあげる

たとえば enum State: String を受け取りたい callback の protocol があるとして、

@objc protocol SomethingDelegate {
    @objc optional
    func callback(state: String?, error : Error?)

のように、 State ではなく String で定義する。で、 Objective-C に渡す callback を swift 上では、下記のように書いてあげる

            callback: { (state: State?) in
                delegate.callback?(state: state?.rawValue, error: error)
            }

すると、 Method cannot be marked @objc because its result type cannot be represented in Objective-C を言われずに済む。

載せられるコードだけ部分的に載せたから、いい例になってなかったらごめんなさい。

negito6
今はこの会社で、水産養殖 IoT の仕事してます。 https://umitron.com/ja/ 編集リクエスト、コメント大歓迎です。よろしくお願いします
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away