Разница между двоеточием (:) и eqaul для оператора (==) - Generic Where Clause: Я хочу, чтобы Array условно соответствовал протоколу
Мне нужно краткое и четкое объяснение того, почему это происходит.
Я использовал "Условно соответствующий протоколу", который представлен в быстрой документации ( ссылка)
я хочу 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>()