Мне нужно краткое и четкое объяснение того, почему это происходит.
Я использовал «Условное соответствие протоколу», который представлен в быстрой документации ( ссылка )
Я хочу, чтобы тип 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>()