Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

Let's have two optional NSArrays. The goal is to check, if they are equal. My solution is

func isArrayEqualToArray(array1:NSArray?, array2:NSArray?) -> Bool {

    let areBothEmpty:Bool = array1 == nil && array2 == nil

    var areBothEqual:Bool
    if !areBothEmpty && array2 != nil {
        areBothEqual = array1?.isEqualToArray(array2!) ?? false
    } else {
        areBothEqual = false
    }

    let result = areBothEqual || areBothEmpty
    return result
}

I feel that it is a little too verbose. It should be doable in a more concise and readable way. Does anyone have a better solution?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
707 views
Welcome To Ask or Share your Answers For Others

1 Answer

It is quite simple:

func isArrayEqualToArray(array1: NSArray?, array2: NSArray?) -> Bool {
    return array1 == array2
}

does exactly what you want.

Why does it work? Here == is the operator that compares optionals

func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

and that gives true if both operands are nil, or of both operands are non-nil and the unwrapped operands are equal.

Also NSArray inherits from NSObject which conforms to Equatable, and comparing NSObjects with == uses the isEqual: method, which is implemented as isEqualToArray: on NSArray. Therefore

array1 == array2

gives the same result as

array1.isEqualToArray(array2)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...