Swiftでタイプ消去を数回使用しなければならなかったのですが、それはいつも汎用プロトコルを含んでいました。この場合、一般的なenum とと汎用プロトコルの両方が関係しており、私は困惑しています。一般的な列挙型と一般的なプロトコルの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<_>>')
私はこれをしばらくは続けてきましたが、このコードには「ほぼ成功しました」というかなりのバリエーションがあります。エラーは常にがゲッターと関係します。
あなたは私がそのタイプ – dan
のインスタンスを取るメソッドにタイプを渡していますあなたの 'getNewState'関数が入力を受け取る理由を少し混乱させますが、確かにそれは'() - > UIState <[Model]> 'でなければなりません。 'getNewState'と' setNewState'関数が、あなたの型削除に渡して設定を転送するためだけに存在するとしても、それは必要ではありません。これは、型閉めで型を削除することで直接行うことができます(つまり '_getNewState = state} '&' _setNewState = {models.state = $ 0} ')。 – Hamish
はい私はそれについてもちょっと混乱しています:)。もともと私は入力を取っていないときにエラーを受けていたので、入力が必要です。私はリファクタリングしようとしましょう。 – damianesteban