1. ホーム
  2. スイフト

[解決済み】コンパイラーエラー。Objective-C のセレクタを持つメソッドは、同じ Objective-C セレクタを持つ以前の宣言と競合しています。

2022-04-11 09:26:53

質問

私はSwiftを学び始めており、YouTubeで非常に良いスタンフォード大学のビデオ講義を追っています。ここに、もしあなたが興味を持ったり、それが役に立ったりするならば、リンクがあります(私の問題を理解するのに必要ではありませんが)。

SwiftでiOS 8アプリを開発する - 2.もっと知りたいXcodeとSwift、MVC

講義を受けながら、自分のコードはビデオのコードと同じなのに、私のシステムではコンパイラーエラーが出るという事態に陥りました(わかる範囲では)。試行錯誤の末、コードを2つの例に絞り、片方はエラーを発生させ、もう片方は発生させないようにしましたが、実際に何が原因でエラーが発生しているのか、どのように解決すればいいのかが全く分かりません。

エラーを発生させるコードは

import UIKit

class BugViewController: UIViewController
{
    func perform(operation: (Double) -> Double) {
    }

    func perform(operation: (Double, Double) -> Double) {
    }
}

これは以下のようなコンパイラーエラーを発生させます。

メソッド 'perform' に Objective-C セレクタ 'perform: ' は、同じ Objective-C セレクタを持つ以前の宣言と競合します。

UIViewControllerのサブクラス化を取り除くだけで、コードはコンパイルされます。

import UIKit

class BugViewController
{
    func perform(operation: (Double) -> Double) {
    }

    func perform(operation: (Double, Double) -> Double) {
    }
}

その他、関連性の有無にかかわらず、いくつかの情報を提供します。

  • 最近Yosemiteにアップグレードしました。
  • Xcodeをインストールしたとき、(私の記憶が正しければ)これが私のバージョンのOS Xで実行するために必要なバージョンだったので、結局ベータ版(Version 6.3 (6D543q))にしました。

そうでなければ意味がないので、これはコンパイラのバグであることを半分願っています。何か助かる方法があれば、ぜひ教えてください。

解決方法は?

Objective-Cはメソッドのオーバーロードをサポートしていませんので、別のメソッド名を使用する必要があります。UIViewControllerを継承した時点でNSObjectを継承し、Obj-Cと相互運用可能なクラスにしています。一方、Swiftはオーバーロードをサポートしているので、継承を解除しても動作するわけです。