2017-02-13 4 views
0

다음과 같이 설명 할 수있는 클래스를 만들려고합니다. a) 특정 유형의 속성 (예 : T)을 유지하고 동일한 유형 (T)을 업데이트 할 수있는 다른 유형의 속성을 유지하는 것으로 설명 할 수 있습니다. 내 (비 작동) 예 : 위의 예, 내가 프로토콜의 associatedtypemyContainer프로토콜 및 관련 유형의 일반 유형 사용?

의 제네릭 형식과 일치하는지 확인하려면에서

protocol Updater { 
    associatedtype UpdateType 
    func update(withSuccess success: ((UpdateType) -> Void)?, failure: ((NSError) -> Void)?) 
} 

class MyContainer<T> { 
    private(set) var object: T 
    private(set) var updater: Updater 
} 

는 빠른에서 할이 수 있습니까?

Thansk!

답변

0

Updater 유형의 속성을 사용할 수 없습니다. 그것은 추상적입니다. 콘크리트 유형 (이 경우에는 U)을 제한하는 데 사용해야합니다.

class MyContainer<T, U: Updater> where U.UpdateType == T { 
    private(set) var object: T 
    private(set) var updater: U 
} 

그러나이 방법은 지루할 수 있습니다. where U.UpdateType == T 절은 종종 MyContainer을 사용하는 코드를 통해 반복적으로 전파됩니다.

일반적으로 해결책은 유형 지우개입니다. 물론

struct Updater<T> { 
    var success: ((T) -> Void)? 
    var failure: ((NSError) -> Void)? 
} 

class MyContainer<T> { 
    private(set) var object: T 
    private(set) var updater: Updater<T> 
} 

Updater 대신 하나의 update(withSuccess:withFailure:) 방법을 포장 할 수 있지만 이런 식으로 그것을 분할 종종 실제로는 훨씬 좋네요 : 오히려 프로토콜보다 폐쇄와 일반을 사용합니다.