【解決】Redundant conformance of ‘NSDate’ to protocol ‘Comparable’エラーが出た時の対処方法
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
アプリ開発中に「Redundant conformance of ‘NSDate’ to protocol ‘Comparable」というエラーが出てしまったのですが、無事解決できたのでその対処法について紹介したいと思います。
(※以下、どこか間違いなどがあればぜひTwitterなどでご指摘下さい!)
「Redundant conformance of ‘NSDate’ to protocol ‘Comparable」の意味
まず「Redundant conformance of ‘NSDate’ to protocol ‘Comparable」というエラーの意味について調べていきます。
Redundantは「余分な」、conformanceは「順応」という意味ですから、「Comparableプロトコルに対する、NSDateの余分な順応」みたいな意味でしょう。
ちょっと実験してみます。
struct DataObject : Equatable { var data : String } func ==(lhs: DataObject, rhs: DataObject) -> Bool { return lhs.data == rhs.data } // redundant conformance of 'DataObject' to protocol 'Equatable' extension DataObject : Equatable { }
上のコードでは2箇所でDataObjectをEquatableプロトコルに適合させようとしていますが、こういった場合に出るエラーのようです。
自分のプロジェクトでは1箇所でしかComparableプロトコルに適合させていない
先ほどの調査結果を踏まえて自分のプロジェクトを見なおしてみたのですが、NSDateクラスをComparableプロトコルに適合させようとしているコードは1箇所しかありませんでした。
ではなぜ「Redundant conformance of ‘NSDate’ to protocol ‘Comparable」エラーが出たのでしょうか?
Target Membership の設定
エラーメッセージをもう一度よく見なおしてみると、
テストターゲットである「DateTestSampleTests」でだけエラーが発生しています。
そこで思い出したのが「Target Membership」の設定。
Swiftの場合はXcodeのターゲット単位がモジュールとなるようで、テストターゲットからも見えて欲しいDateCompare.swift(NSDateのCompareに関するコードが書かれている)はアプリターゲットとテストターゲットの両方にチェックを入れたことを思い出しました。
そこでテストターゲットのチェックを外して、
テストを実行してみます。
すると「Binary operator ‘<’ cannot be applied to two ‘NSDate’ operands」というエラーが出ました。
テストターゲットから、DateCompare.swiftに書かれているCompareに関するコードが見えていないからですね。
アプリターゲットのimportを忘れていた!
テストコードの上の方を見ると・・・
なんとアプリターゲットのimportを忘れていました!
「@testable import DateTestSample」という記述を追加したら、無事テストを実行できるようになりました。
ちなみに「@testable」と書くと、そのモジュール内のinternalな要素にもアクセスできるようになります。ただしprivateな要素にはアクセス出来ないようなので注意が必要です。
@akio0911はこう思った。
このエラーが出たおかげで、Swiftのアクセス制御・ターゲット・モジュール・単体テストあたりの理解が深まったので、良い機会となりました(^^)
Swiftのアクセス制御などに関する説明は、以下の本が詳しかったです!
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!