【问题标题】:Swift generic type conforming to two protocols符合两种协议的 Swift 泛型类型
【发布时间】:2014-12-24 08:30:14
【问题描述】:

我的一个类中有一个泛型方法,我希望有一个符合UIViewControllerUIPickerViewDelegate 的泛型类型。我怎样才能做到这一点?我想过这样做:

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {}

但是这段代码不能“识别”UIPickerViewDelegate。我还想过使用管道 | 代替逗号,但更糟糕的是,编译器不接受这一点。 是否可以这样做或者我必须为类和协议做 2 个参数?还是有更好的解决方法?

感谢您的帮助,圣诞快乐:]

【问题讨论】:

    标签: generics swift ios8


    【解决方案1】:

    您的代码:

    func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {}
    

    声明2个泛型参数:

    • TUIViewController。并用作viewController 参数类型。
    • UIPickerViewDelegateAny。而且没有使用。

    相反,您应该使用"Where Clause",例如:

    func foo<T: UIViewController where T:UIPickerViewDelegate> (#viewController: T) {}
    

    【讨论】:

    • 非常感谢!我不知道可以在那里使用关键字where。但是现在我在通过.foo(viewController: self) 在我的viewController(符合UIPickerViewDelegate)中调用此方法时遇到了另一个问题,我收到以下错误:Type 'UIViewController' does not conform to protocol 'UIPickerViewDelegate'。有什么问题?再次感谢您的帮助;)
    • class MyViewController: UIViewController, UIPickerViewDelegate {... } 为我工作。如何声明 viewController?
    • 我还有其他一些协议:UITableViewDataSource, UITableViewDelegate, UIPickerViewDataSource
    • 感谢@rintaro!
    • @borchero 你找到解决方案了吗?由于某种原因,我遇到了同样的错误
    【解决方案2】:

    Swift 4 中发生了一些变化: func foo<T: UIViewController> (viewController: T) where T:UIPickerViewDelegate {}

    【讨论】:

      【解决方案3】:

      Swift 4 开始,您可以使用 Protocol Composition 的强大功能。 给你:

      func foo<T: UIViewController & UIPickerViewDelegate> (viewController: T) {}
      

      【讨论】:

        猜你喜欢
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 2014-07-24
        • 2016-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多