2016-04-19 23 views
2

私がテストを書いている:比較配列

func test_arrayFromShufflingArray() { 

     var videos = [MockObjects.mockVMVideo_1(), MockObjects.mockVMVideo_2(), MockObjects.mockVMVideo_3()] 
     let tuple = ShuffleHelper.arrayFromShufflingArray(videos, currentIndex:1) 

     var shuffledVideos = tuple.0 
     let shuffleIndexMap = tuple.1 


     // -- test order is different 
     XCTAssert(videos != shuffledVideos, "test_arrayFromShufflingArray fail") 
    } 

しかし、私は最後の行を取得最後の行に:

Binary operator '!=' cannot be applied to two '[VMVideo!]' operands 
+0

これはテスト対象のものかどうかと思います。私はココアポッドでテストターゲットを入力する際に​​問題がありました。 – Ramsel

+0

VMVideoクラスはEquatableプロトコルに準拠していますか?なぜなら、コンパイラは配列のオブジェクトがそれに準拠していないと言っているので、!=演算子を使用することはできません。 – dudeman

答えて

1

配列タイプは、Equatableの場合、==を比較することができます。

/// Returns true if these arrays contain the same elements. 
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool 

しかし、どちらもImplicitlyUnwrappedOptional<Wrapped>Optional<Wrapped>は 基になる型Wrappedがない場合でも、Equatableに準拠しています。

可能なオプションは(VMVideoEquatableに準拠していることを仮定して)されています

  • 変更してコードをvideosshuffledVideosはなく[VMVideo!][VMVideo]配列があるように。

    XCTAssert(videos.count == shuffledVideos.count 
        && !zip(videos, shuffledVideos).contains {$0 != $1 }) 
    
  • 暗黙的に開封されたequatable 要素のアレイ用==演算子を定義します:マーティンRの答えは、良い答えだったが、

    func ==<Element : Equatable> (lhs: [Element!], rhs: [Element!]) -> Bool { 
        return lhs.count == rhs.count && !zip(lhs, rhs).contains {$0 != $1 } 
    } 
    
0

スウィフトは、2つを比較する方法を伝えることはできません個々の要素を比較する方法が分からない限り、その内容が同一であるかどうかを調べることができます。ですから、あなたのクラスに==機能を実装し、Equatableを採用する必要があります:それはNSObjectとどのように相互作用するかを明確にすると、ご使用の環境のトラブルシューティングに

extension VMVideo: Equatable { 
    // nothing goes here, == function has to be at global scope 
} 

func ==(lhs: VMVideo, rhs: VMVideo) -> Bool { 
    // Up to you to determine what equality means for your object, e.g.: 
    return lhs.essentialProperty1 == rhs.essentialProperty1 && 
     lhs.essentialProperty2 == rhs.essentialProperty2 
} 

EDIT、以下をご確認ください。

class UnderstandsEqual: NSObject {} 
let ok1: [UnderstandsEqual] = [UnderstandsEqual(), UnderstandsEqual()] 
let ok2: [UnderstandsEqual] = [UnderstandsEqual(), UnderstandsEqual()] 
ok1 == ok2 // no problem, evaluates to true 

class DoesntUnderstand {} 
let bad1: [DoesntUnderstand] = [DoesntUnderstand(), DoesntUnderstand()] 
let bad2: [DoesntUnderstand] = [DoesntUnderstand(), DoesntUnderstand()] 
bad1 == bad2 // produces a compile-time error 
+0

VMVideoはobj-cクラスであり、私たちは 'isEqual'をオーバーライドしました... Swiftは自動的に私のことを使用しませんか? – Ramsel

+0

私は簡単にNSArraysに変換すると思います。 – Ramsel

+0

スウィフトします。 https://books.google.com/books?id=FMqhCgAAQBAJ&pg=PA457&lpg=PA457#v=onepage&q=falseのページ457を参照してください。何か問題があります。配列外の2つのVMVideoオブジェクトの '=='を使って単純比較をしようとするとどうなりますか? – BaseZen

0

  • は、配列は要素ごとの比較しますこの特定の目的のために、私はちょうどNSArrayに変換し、Swiftで==演算子を使用することができました:

    func test_arrayFromShufflingArray() { 
    
        let videos = [MockObjects.mockVMVideo_1(), MockObjects.mockVMVideo_2(), MockObjects.mockVMVideo_3()] 
        let videosNSArray: NSArray = videos.map { $0 } 
        let tuple = ShuffleHelper.arrayFromShufflingArray(videos, currentIndex:1) 
    
        let shuffledVideos = tuple.0 
        let shuffledVideosNSArray: NSArray = shuffledVideos.map { $0 } 
    
    
        // -- test order is different 
        XCTAssert(videosNSArray != shuffledVideosNSArray, "test_arrayFromShufflingArray fail") 
    
    
        // -- test elements are the same 
        let set = NSSet(array: videos) 
        let shuffledSet = NSSet(array: shuffledVideos) 
        XCTAssert(set == shuffledSet, "test_arrayFromShufflingArray fail") 
    }