Это дело
protocol Repository {
func add<T>(data : T) -> Bool
}
понимается компилятором как: «Любой тип, который передается в func add
, будет приемлемым, и результат функции будет Bool
»
Но это
protocol Repository {
associatedtype T
func add(data : T) -> Bool
}
понимается компилятором как: «func add
примет только тип, определенный в typealias T = ...
и вернет Bool
»
Во втором случае вы ограничиваете общие параметры только типизированными типами.
Другая важная функция обнаруживается при использовании общих параметров в нескольких функциях протокола. В этом случае он гарантирует, что func add<T>
и func multiply<T>
будут иметь одинаковый тип T
. В случае универсальных функций это не гарантируется.
protocol Calculable {
associatedtype T
func add<T>(a: T, b: T) -> T
func multiply<T>(a: T, b: T) -> T
}
// In this case you know that T is the same for all functions
protocol CalculableDifferent {
func add<T>(a: T, b: T) -> T
func multiply<T>(a: T, b: T) -> T
}
// In this case add can accept One type, when multiply can accept Another