40145


swift を開発していて、 Java のインターフェイスと同じノリで override を protocol の実装関数に付与しようとしました。

[code]

    protocol HogeDelegate {
        func hoge()
    }
    
    class HogeController: HogeDelegate {
        override func hoge() {
    
        }
    }
    
[/code]

しかしこれは、 `Method does not override any method from its superclass` のエラーになります。

どうやら、 swift の override は class のメソッドに対して定義されるべきもので、 protocol
の実装にあたっては付与してはいけなさそうだ、と思っています。しかし、これだと、例えばシグネチャーが複雑になってきたときに、確かにほしい実装を今行えているのだろうか、と心配になったりします。(とくに、
protocol がデフォルトを持っている場合)

質問:

  * swift において、 protocol で定義される関数の実装を行っている場合に、それが確かに protocol の関数を実装できていることを、言語的に強制することはできますか?


CC BY-SA 3.0
2017-12-09T01:15:02.307
40144
2017-12-09T02:25:54.967
754
question
swift
swift で protocol 実装関数がたしかに protocol を実装できているかを確認したい

  * **_swift において、 protocol で定義される関数の実装を行っている場合に、それが確かに protocol の関数を実装できていることを、言語的に強制することはできますか?_**

出来ません。

ご質問本文中にあるように、`override`キーワードは親クラスで定義されたメソッドやプロパティをオーバライドする時に必要となるもので、単にメソッドの実装を宣言するために使用することはできません。またprotocol中のメソッドを陽に実装していることを示すような記法も存在しません。

実際問題として、Objective-
Cのprotocolでは多くのメソッドが`optional`と宣言されており、クラス自体がそのprotocolに適合していると宣言しても、実際には必要なメソッドが実装できていない、なんてことが開発初期や初学者のバグとして多く見受けられます。ご質問の主題のようなチェック機能があれば、それらのバグがより容易に見つけられるかと思うのですが、Swift登場直後の旧Apple
Developer Forumsでは、そのような提案は軽くいなされてしまっていました。(Appleの旧Developer
Forumsは検索機能が非常に使いづらいので、リンクをすぐに見つけることはできませんでした。)

Swiftが「安全」を標榜する言語である以上、ご質問にあるような機能は必要だろうと思われるので、「この機能があることでこんなにたくさんのエラーが防げる」なんて事例をたっぷり添えて、説得力豊かに[swift-
evolutionのメーリングリスト](https://lists.swift.org/mailman/listinfo/swift-
evolution)に(英語で)提案できれば、Swift
5にはそんな機能が登場するかもしれません。一度否定的な判断が下された内容を覆すのは大変かもしれませんが、まだ[否定的事例集](https://github.com/apple/swift-
evolution/blob/master/commonly_proposed.md)には掲載されていないので、可能性はあるかもしれません。どなたか英語力に自信のある方は是非…。

(Swift言語の開発者たちは、MigratorやIDEサポート機能等を賢くすれば多くの事例は防げる的に判断しているようですが。)


CC BY-SA 3.0
2017-12-09T02:25:54.967
40145
2017-12-09T02:25:54.967
13972
40144
answer