В написанном вами коде на самом деле нет функциональной разницы, потому что вы установили associatedType
как Int
.
Чтобы получить более мощное использование из них, вы можете использовать associatedType
в качестве псевдо-общего ограничения.
Так что вы можете написать это так ...
protocol P1 {
associatedType Item: Equatable
var itemArray: [Item] { get set }
func add(item: Item)
}
extension P1 {
func add(item: Item) {
itemArray.append(item)
}
}
struct StructWithStrings: P1 {
var itemArray: [String]
}
struct StructWithInts: P1 {
var itemArray: [Int]
}
Поскольку они оба соответствуют P1, и они оба устанавливают свой тип массива на Equatable
типы. Компилятор может определить правильный тип функции add(item: Item)
и помочь во время компиляции.
В отличие от этого ... typealias
действительно используется только для изменения названия какого-либо типа для удобства. Например, вы можете использовать замыкание во многом как ... (Data?, Error?, URLResponse) -> ()
, и было бы долго писать его много раз, но при этом оно теряло бы часть смысла. Так что вы могли бы сделать ...
typealias DownloadResponse = (Data?, Error?, URLResponse) -> ()
и замените все употребления на DownloadResponse
.
В Swift есть множество отличных ресурсов по ассоциированному типу ...
- Взлом со Swift
- Наташа Робот
- Средний