Понимание обобщений с общим ограничением - PullRequest
0 голосов
/ 27 февраля 2019
protocol Nameable: Equatable {
    var name: String { get set }
}

struct Person: Nameable {
    var name: String
}

struct Car: Nameable {
    var name: String
}

Теперь я могу ограничить функцию возможностью печати элементов, соответствующих протоколу Nameable, поскольку они относятся к одному типу?

func printNameable<T: Nameable>(_ list: [T]) {

}

Но как я могу создать этот список?Я получаю синтаксическую ошибку.

var nameableList<T: Nameable>: [T] = []

Или, если я попробую затем, я получу Протокол «Nameable» может использоваться только как общее ограничение ...

var nameables: [Nameable] = []

Я вынужден указать тип Nameable, например Person или Car, чтобы создать этот список?

В конце концов, Мне нужен массив общего протокола, который может иметь различные типы.объекты, которые я могу сравнить , если они разного типа, они разные, но если нет, я хочу сравнить их.

var nameables: [Nameable] = [Person(name: "John"), Car(name: "Ferrari")]

nameables.contains(Car(name: "Ferrari")) 

(я думаю, оба типа, Person и Автомобиль должен соответствовать протоколу Equatable).

1 Ответ

0 голосов
/ 27 февраля 2019

На самом деле вы не можете передать printNameable<T>(_:) массив, который содержит объекты Car и Person, он может содержать только один или другой.Универсальный тип T не является значением времени выполнения, он вычисляется во время компиляции, поэтому, если ваш код вызывает printNameable(persons) и printNameable(cars), у вас фактически будут две разные скомпилированные функции (кто-то исправит меня, если я ошибаюсь).

Как @Sandeep Bhandari упомянул в своем комментарии, поскольку ваш протокол расширяет Equatable, который содержит Self, ваш протокол может использоваться только как общее ограничение.Если вы хотите, чтобы ваш протокол работал так, как вы хотите, просто удалите Equatable, а затем измените printNameable(_:) на

func printNameable(_ list: [Nameable]) {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...