Swift에서 유형 지우기를 몇 번 사용해야했지만 항상 일반 프로토콜이 필요했습니다. 이 경우 일반 전화 번호 및과 일반 프로토콜이 모두 포함되어 있습니다.일반 열거 형 및 일반 프로토콜을 사용하는 신속한 유형 삭제
enum UIState<T> {
case Loading
case Success([T])
case Failure(ErrorType)
}
protocol ModelsDelegate: class {
associatedtype Model
var state: UIState<[Model]> { get set }
}
extension ModelsDelegate {
func getNewState(state: UIState<[Model]>) -> UIState<[Model]> {
return state
}
func setNewState(models: UIState<[Model]>) {
state = models
}
}
그리고 여기가 내 타입이 삭제 제네릭 클래스입니다 :
class AnyModelsDelegate<T>: ModelsDelegate {
var state: UIState<[T]> {
get { return _getNewState(UIState<[T]>) } // Error #1
set { _setNewState(newValue) }
}
private let _getNewState: ((UIState<[T]>) -> UIState<[T]>)
private let _setNewState: (UIState<[T]> -> Void)
required init<U: ModelsDelegate where U.Model == T>(_ models: U) {
_getNewState = models.getNewState
_setNewState = models.setNewState
}
}
나는 다음과 같은 오류를 받고 있어요 (그들이 여기
필요한 확장자를 가진 나의 일반적인 열거 및 일반 프로토콜입니다) 코드 샘플에 표시 :오류 # 1 :
Cannot convert value of type '(UIState<[T]>).Type' (aka 'UIState<Array<T>>.Type') to expected argument type 'UIState<[_]>' (aka 'UIState<Array<_>>')
나는 잠시 동안이 작업을 해왔으며이 코드에 "거의 효과가 있었다"는 변형이 많이있었습니다. 항상은 getter와 관련이 있습니다.
당신은 그 유형 – dan
I의 인스턴스를 소요하는 방법에 유형을 전달하는 :
위의 제안 된 변경과 함께 모두 모두를, 당신은 이런 식으로 뭔가를보고 코드를 할 것입니다 'getNewState' 함수가 왜 입력을 받는지 조금 혼란 스럽 습니다만, 분명히'() -> UIState <[Model]>'이어야합니까? getNewState와 setNewState 함수가 get과 setting을 당신의 타입 지우기로 포워딩하기 위해서만 존재한다면, 그것들은 꼭 필요하지 않습니다. 당신이 closure를 가진 타입 지우기 (즉,'_getNewState = {models. state}'&'_setNewState = {models.state = $ 0}'). – Hamish
그래, 나도 조금 혼란스러워. :). 원래 입력을받지 않았을 때 원래 오류가 발생했기 때문에 입력이 필요합니다. 내가 리팩토링을 시도하겠습니다. – damianesteban