Não entendo a seguinte situação:
let a1: [[Double]] = [[1]]
let equ1 = a1 == a1 // This builds
let t1: (Double, Double) = (1, 1)
let equ2 = t1 == t1 // This builds also
let a2: [[(Double, Double)]] = [[(1,1)]]
let equ3 = a2 == a2 // This gives a build error
O erro de construção é
Binary operator '==' cannot be applied to two '[[(Double, Double)]]' operands
Por que posso verificar a igualdade para uma matriz de dois dim de Double
, para uma tupla de 2 Doubles
, mas não para uma matriz de dois dim desta tupla?
É um comportamento esperado. Vamos analisar cada caso:
Você está comparando arrays bidimensionais de double, e como Double está em conformidade com o
Equatable
protocolo (==
neste cenário), o array está em total conformidade com oEquatable
protocolo também, o que o torna capaz de comparar. Você pode querer verificar esta documentação .SE-0015 , Swift 2.2.1 indica que você pode comparar tuplas de até 6 elementos com a
==
função.Tuplas não são capazes de se conformar a nenhum tipo de protocolo até agora. Até mesmo cada elemento dentro é capaz de fazer isso, mas isso não significa que a tupla inteira pode. Eu encontrei este PR-46668 também fez a mesma pergunta que você.
Nota do site: você pode querer resumir em um
Struct
ouClass
, algo como:Tupla como um tipo não está em conformidade com o Equatable, mesmo que os elementos estejam. O compilador tem suporte para comparar tuplas contendo até 6 elementos para igualdade, mas isso não é a mesma coisa que estar em conformidade com o protocolo Equatable.
E um objeto Array só está em conformidade com Equatable se seus elementos estiverem, o que não é o caso aqui.
Portanto, nem seu array de arrays de tuplas ou mesmo um array simples de tuplas se comparará ao Equatable pronto para uso.