2016-07-04 3 views
1

У меня есть первый протоколSwift массив протоколов с associatedtype

protocol Prot1 
{ 

} 

И второе:

protocol Prot2 
{ 
    associatedtype P: Prot1 

    func doSomething(param: P) 
} 

Как я могу сделать массив с типом PROT2?

Я пробовал:

var myArray = [Prot2]() 

Но это дает мне эту ошибку: протокол PROT2 может быть использован только в качестве общего ограничения, поскольку он имеет Самость или связанные с ними требования типа

Есть ли другой способ создать протокол шаблонов?

EDIT:

Извините, если я опаздываю, но я тестировал решения. Насколько я понимаю, тип стертого

AnyProt2<Prot1Type: Prot1>: Prot2 

позволяет мне иметь массив с

[AnyProt2<Prot1Class>] 

, но я просил массив, который может содержать все виды AnyProt2 что-то вроде:

[AnyProt2] or [AnyProt2<Prot1>] 

Я попробовал второй, но это дает мне:

Using 'Prot1' as a concrete type conforming to protocol 'Prot1' is not supported.

В моем контексте Prot1 является Интервалом, а Prot2 - событием, поэтому я хотел иметь и массировать различные события, которые могут иметь разные виды интервалов. Я также хочу спросить, возможно ли сделать Prot1 для расширения Equatable и подтвердить протокол в AnyProt2.

+0

Любая помощь для обновления? – 4bottiglie

ответ

3

В зависимости от вашего случая использования, вы можете уйти с использованием дженерик, например, так:

protocol Prot1 { 
} 

protocol Prot2 { 
    associatedtype P: Prot1 
    func doSomething(param: P) 
} 

class MyClass<T: Prot2> { 
    var arr: [T] = [] 
} 

Но это решение в значительной степени отсрочивает уточнение от конкретного типа, реализующего Prot2 и делает потребитель MyClass иметь дело с что.

Похоже, что ваш случай потребует использования чего-то типа стирания типа. К сожалению, я не смогу объяснить это здесь, но вот некоторые действительно большие статьи и даже говорит, что помогли мне понять концепцию:

Смежные вопросы