2014-09-19 3 views
5

Я хочу ввести словарный словарь для строковых ключей и значений объектов/структур, которые реализуют Equatable protocol. Поэтому я написал эту строку кода, но это дало мне ошибку, что я не знал, как продолжить исправление.Словарь Swift - Typealias со значением, реализующим общий протокол

typealias Storage = [String: Equatable] 

Я хочу использовать тип [String: Equatable] в качестве переменной в протоколе, например:

protocol StorageModel { 
    var storage: Storage { get set } 
    init(storage: Storage) 
} 

Ошибка:

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements

enter image description here Может кто-нибудь предложить решение ?

ответ

5

Вообще говоря, тег протокола не требуется, имена протоколов имена типа первого класса и могут быть использованы непосредственно:

typealias Storage = [String:Equatable] 

В этом случае, что ошибка говорит вам, что из-за Equatable включает в себя func == (lhs:Self, rhs:Self) -> Bool и, в частности, lhs:Self Equatable не могут быть использованы, кроме как ограничение на общий:

class Generic<T:Equatable> { ... } 

Без получения более подробной информации о том, что вы пытаетесь достичь и как вы пытаетесь использовать StorageModel, лучший Я могу придумать является:

protocol Matches { 
    typealias T 
    func matches(t:T) -> Bool 
} 

protocol StorageModel { 
    typealias T 
    var storage: [String:T] { get set } 
    init(storage:[String:T]) 
} 

extension Int : Matches { 
    func matches(target:Int) -> Bool { 
     return self == target 
    } 
} 

class MyClass <T:Matches> { 
    var model = [String:T]() 


} 

Другая возможность заключается в том, чтобы использовать общий вместо протокола:

class StorageModel <T:Equatable> { 
    var storage: [String:T] 

    init(storage:[String:T]) { 
     self.storage = storage 
    } 
} 

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

+0

Как я могу достичь этого другими словами? –

+1

Из-за того, что Equalable определен, я не думаю, что вы можете без определения своего собственного протокола, который очень похож на Equatable, и даже тогда я думаю, что вы столкнетесь с той же проблемой. Лучше всего определить новый протокол, который определяет метод equals и использовать его. –

+0

Я только что обновил вопрос, не могли бы вы помочь мне с тем, как я мог обходным путем? –

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