Разница между двоеточием (:) и eqaul для оператора (==) - Generic Where Clause: Я хочу, чтобы Array условно соответствовал протоколу - PullRequest
1 голос
/ 30 мая 2019

Мне нужно краткое и четкое объяснение того, почему это происходит.

Я использовал «Условное соответствие протоколу», который представлен в быстрой документации ( ссылка )

Я хочу, чтобы тип Array соответствовал моему протоколу Test, если элементы в массиве соответствуют этому протоколу.

protocol Test {
    var result : String {get}
}

extension Int: Test {
    var result: String {
        return "int"
    }
}

extension Array: Test where Element: Test {
    var result: String {
        return "array"
    }
}

Затем я объявил экземпляр массива следующим образом.

let array1 = Array<Test>()

print(array1 is Test) // **false**

Я думал, что array1 должен был соответствовать протоколу Test (true), но его не нашли.

Затем я попробовал следующий способ расширения, и он сработал.

extension Array: Test where Element == Test {
    var result: String {
        return "array"
    }
}

let array2 = Array<Test>()

print(array2 is Test) // **true**

Я думал, что Array<Test>() означает "массив , который может принимать элементы, соответствующие Test протоколу ", так что этот массив должен был соответствовать тому же протоколу точно так же, как я объявил в первом расширении.


Вопрос
1. Разница между двоеточием (:) и оператором равенства (==)
- : означаеттолько соответствующий тип / == означает идентичный тип?
2. Объяснение, как это работает, когда я объявляю экземпляр массива как Array<Test>()

...