3

コントロールのサンプル データを生成しようとしている@IBDesignableので、IB 用にビルドするときに、コントロールをだまして独自のデータソースにしています。結論として、私は IB のみが使用するプロトコルにいくつかのメソッドを追加していますが、善良な市民として、通常の (非 IB ビルド) ではこれらを削除したいと考えています。

問題を次のコード フラグメントに絞り込みました。私のプロトコルは次のようになります:-

protocol TestProtocol {
#if TARGET_INTERFACE_BUILDER
    func myControl(control:AnyObject, colorForIndex index:UInt) -> UIColor?
    func myControl(control:AnyObject, textForIndex index:UInt) -> String?
#endif
}

これはコンパイルに失敗し、メソッドのオーバーロード エラーを意味するメッセージが表示されます: "error: declaration conflicts with previous value". エラー メッセージは 2 番目の関数宣言にあり、衝突している前の宣言として最初の関数を参照しています。

ただし、これらはオーバーロードではなく、名前付きパラメーターのために異なるシグネチャを持っています。そして、これは Cocoa 全体で非常に標準的なデリゲートの命名規則であるため、理由を理解せずにメソッドの名前を変更することに抵抗がありました。

削除すると問題が#if TARGET_INTERFACE_BUILDER修正されるので、もはや差し迫った問題ではありませんが、なぜこの条件付きコンパイルを追加するとこのような奇妙なエラーが発生するのか完全に困惑していますか?

4

1 に答える 1