2017-11-06 1 views
0

제 API 결과 처리를위한 일반 데이터 구조를 만들고 있는데, 온라인으로 읽습니다. 프로토콜과 관련 유형을 사용하는 것이 가장 좋음을 알았습니다. 지금까지 내 구현입니다.다른 프로토콜 함수의 인수로 Swift 프로토콜을 전달하십시오.

protocol CreateDataCallback { 
    associatedtype E 
    func onSuccess(e:E) -> Void 
    func onFail() -> Void 
} 

protocol DataSource: class { 
    associatedtype T 
    func getData<GDC:GetDataCallback>(id:ID, callback:GDC) -> Void 
} 

코드 스 니펫에서 볼 수 있듯이 getData 함수가 올바르게 작성되지 않았습니다. 문제는 DataSource 프로토콜에서 CreateDataCallback 프로토콜의 'associatedtype E'로 'associatedtype T'를 전달하는 방법을 모르겠다는 것입니다. 프로토콜 데이터 소스 확장을 작성할 수는 있지만 일반적이지는 않습니다. 이것도 신속하게 가능합니다 (자바에서 가능합니다). 만약 가능하다면 어떻게했는지 보여주세요. Thx

답변

1

내가 GDC를 DataSource의 관련 유형으로 만들면 GDC가 CreateDataCallBack을 따르게됩니다. 그런 다음 관련 타입 T가 필요합니다, 당신은 단지 GDC.E

protocol DataSource: class{ 
    associatedtype GDC: CreateDataCallback 
    func getData(id:GDC.E, callback:GDC) -> Void 
} 

를 참조 할 수없는 다음 두 가지 프로토콜의 일부 구현의 :

class Bar: CreateDataCallback 
{ 
    func onSuccess(e: Int) { 
     // code 
    } 

    func onFail() { 
     // code 
    } 
    typealias E = Int 
} 

class Foo: DataSource 
{ 
    typealias GDC = Bar // This makes GDC.E a typealias for Int 

    func getData(id: Int, callback: Bar) { 
     // code 
    } 
} 
관련 문제