2014-09-19 2 views
5

Equatable 프로토콜을 구현하는 객체/구조체 및 문자열 키 사전을 입력 합격합니다. 그래서이 코드 줄을 썼지 만 문제를 해결하는 방법을 몰랐다는 오류가있었습니다. 예를 들어 프로토콜에서 변수로 : [Equatable 문자열] :일반 프로토콜을 구현하는 값을 가진 Swift - Typealias 사전

typealias Storage = [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가 일반에 제약 제외하고 사용할 수 없습니다 포함 : 당신이 StorageModel을 사용하려는 달성하기 위해 노력하고 어떻게하는지에 대한 자세한 내용은없이

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

를, 최고의 나는 함께 갈 수있다. 이다, 스위프트 수동 파고, 거기에서

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

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

당신은 몇 가지 조사를해야합니다 일부 인터넷 검색을하고 참조 :

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]() 


} 

또 다른 가능성은 대신 프로토콜의 제네릭을 사용하는 것입니다 무엇이 당신의 문제를 해결합니다.

+0

어떻게해야합니까? –

+1

Equatable가 어떻게 정의 되었기 때문에, 나는 Equatable과 매우 흡사하게 보이는 당신 자신의 프로토콜을 정의하지 않고도 똑같은 문제를 겪을 것이라고 생각하지 않는다. 가장 좋은 방법은 equals 메서드를 정의하고이를 사용하는 새로운 프로토콜을 정의하는 것입니다. –

+0

방금 ​​문제를 업데이트했습니다. 어떻게 해결할 수 있습니까? –

관련 문제