比较力量打开的选项数组

时间:2016-04-19 18:22:37

标签: swift

我正在写一个测试:

    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

3 个答案:

答案 0 :(得分:1)

如果元素类型为==,则可以将 Equatable进行比较:

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

ImplicitlyUnwrappedOptional<Wrapped>Optional<Wrapped>都不符合Equatable,即使是Wrapped 基础类型VMVideo

可能的选项是(假设Equatable符合videos):

  • 更改您的代码,以便shuffledVideos[VMVideo][VMVideo!]数组而不是XCTAssert(videos.count == shuffledVideos.count && !zip(videos, shuffledVideos).contains {$0 != $1 })

  • 按元素比较数组:

    ==
  • 为隐式展开的equatable数组定义func ==<Element : Equatable> (lhs: [Element!], rhs: [Element!]) -> Bool { return lhs.count == rhs.count && !zip(lhs, rhs).contains {$0 != $1 } } 运算符 元素:

    {{1}}

答案 1 :(得分:0)

Swift无法告诉如何比较两个数组,看它们的内容是否相同,除非它知道如何比较各个元素。因此,您需要在班级上实施==功能并采用Equatable

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
}

编辑要说明它与NSObject的互动方式以及对您的环境进行问题排查,请确认以下内容:

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

答案 2 :(得分:0)

Martin R的答案是更好的答案,但出于这个特定目的,我刚刚转换为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")
}