0

3 つのパラメーターを受け取るイニシャライザーが必要な SlidingNavigationController を作成しました。3 つのパラメーターはすべて UIViewControllers である必要がありますが、SlidingIconProtocol に確認する必要があります。だから私はこのようなコードを書きました(簡略化されたバージョン):

struct SlidingItem {
    var bigIconView: UIView
    var smallIconView: UIView
}

protocol SlidingIconProtocol {
    var slidingItem: SlidingItem { get set }
}

class SlidingNavigationController: UIViewController {

    init<T:UIViewController where T:SlidingIconProtocol>(centralVC: T, leftVC: T, rightVC: T) {
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

class CentralVC: UIViewController, SlidingIconProtocol {
    var slidingItem = SlidingItem(bigIconView: UIView(), smallIconView: UIView())
}

class LeftVC: UIViewController, SlidingIconProtocol {
    var slidingItem = SlidingItem(bigIconView: UIView(), smallIconView: UIView())
}

class RightVC: UIViewController, SlidingIconProtocol {
    var slidingItem = SlidingItem(bigIconView: UIView(), smallIconView: UIView())
}


let myVC = SlidingNavigationController(centralVC: CentralVC(), leftVC: LeftVC(), rightVC: RightVC())

問題は、Swift がコードの最後の行でコンパイルに失敗することです。

Swift/Xcode の補完でさえ、このイニシャライザを使用するオプションを提供しているため、これが機能しない理由がわかりません。そして、渡されたすべてのパラメーターは、SlidingIconProtocol に確認されます。

コードのどこが間違っているのか、Swiftで同じことを達成する正しい方法は何ですか(まったく可能ですか)?

4

1 に答える 1

1

そのままではテンプレートを使用できません。あなたのコードで:

init<T:UIViewController where T:SlidingIconProtocol>(centralVC: T, leftVC: T, rightVC: T)
{
    super.init(nibName: nil, bundle: nil)
}

TUIViewControllerおよび を実装するサブクラスであるクラスを表しますSlidingIconProtocol。だからあなたが呼び出すとき:

let myVC = SlidingNavigationController(centralVC: CentralVC(), leftVC: LeftVC(), rightVC: RightVC())

は(最初のパラメーター)TCentralVC見なされ、init メソッドは次のように表されます。

init< CentralVC:UIViewController where CentralVC:SlidingIconProtocol>(centralVC: CentralVC, leftVC: CentralVC, rightVC: CentralVC)
{
    super.init(nibName: nil, bundle: nil)
}

しかし、2 番目と 3 番目のパラメーターとして異なるクラス オブジェクトを渡しています。そして、それはエラーをスローします。クラスでは、次のコードが有効です。

let myVC = SlidingNavigationController(centralVC: CentralVC(), leftVC: CentralVC(), rightVC: CentralVC())

渡された引数はすべて同じクラス ( ) のオブジェクトであるためCentralVCです。initしたがって、問題を修正するには、次の方法でメソッドを実装する必要があります。

init<T1:UIViewController, T2:UIViewController, T3:UIViewController where T1:SlidingIconProtocol, T2:SlidingIconProtocol, T3:SlidingIconProtocol>(centralVC: T1, leftVC: T2, rightVC: T3)
{
    super.init(nibName: nil, bundle: nil)
}
于 2015-11-05T08:37:16.233 に答える