Protocol relatedType и <> - PullRequest
       9

Protocol relatedType и <>

0 голосов
/ 29 октября 2018

В чем разница между использованием универсального с функцией или ассоциированным типом в быстрых протоколах?

protocol Repository {
    associatedtype T
    func add(data : T) -> Bool
}

и

protocol Repository {
    func add<T>(data : T) -> Bool
}

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Это дело

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
0 голосов
/ 29 октября 2018

Определенный связанный тип делает классы, которые соответствуют протоколу строгой типизации. Это обеспечивает обработку ошибок во время компиляции.

С другой стороны, универсальный тип делает классы, которые соответствуют протоколу, более гибкими.

Например:

protocol AssociatedRepository {
    associatedtype T
    func add(data : T) -> Bool
}

protocol GenericRepository {
    func add<T>(data : T) -> Bool
}


class A: GenericRepository {
    func add<T>(data : T) -> Bool {
        return true
    }
}

class B: AssociatedRepository {
    typealias T = UIViewController
    func add(data : T) -> Bool {
        return true
    }
}

class A может поместить любой класс в функцию add(data:), поэтому вам нужно убедиться, что функция обрабатывает все случаи.

A().add(data: UIView())
A().add(data: UIViewController())

оба будут действительны

Но для класса B вы получите ошибку во время компиляции, когда попытаетесь поместить что-либо, кроме UIViewController

B().add(data: UIView()) // compile-time error here
B().add(data: UIViewController())
0 голосов
/ 29 октября 2018
  • associatedtype - это статический тип в struct / class, который принимает протокол либо через объявление typealias, либо через вывод типа. Тип всегда один и тот же для этого класса.

  • Универсальным может быть что угодно, даже разные типы в одном классе.

...