【问题标题】:Make property of type and also conform to protocol in Swift在 Swift 中创建类型属性并符合协议
【发布时间】:2015-04-26 18:21:36
【问题描述】:

我想创建一个特定类型且符合协议的属性,我会在 Objective-C 中这样做:

@property (nonatomic) UIViewController<CustomProtocol> *controller;

我正在寻找的是指定属性可以使用 UIViewController 类型的对象设置,该对象也符合 CustomProtocol,以便清楚基类是什么。我知道我可能只使用一个简短的类存根来获得相同的结果,即

class CustomViewController : UIViewController, CustomProtocol {}

但这似乎不是最干净的方法。

【问题讨论】:

    标签: swift uiviewcontroller swift-protocols


    【解决方案1】:

    现在可以使用内置合成:

    var children = [UIViewController & NavigationScrollable]()

    【讨论】:

      【解决方案2】:

      我想不出用 Swift 表达这一点的好方法。 syntax for a type 是:

      类型 → 数组类型 |字典类型 |函数类型 |类型标识符 | 元组类型 |可选类型 |隐式展开可选类型 | 协议组合类型 |元类型类型

      您正在寻找的是一种也接受基类的protocol-combination-type。 (Protocol-combination-typeprotocol&lt;Proto1, Proto2, Proto3, …&gt;。)但是,目前这是不可能的。

      具有相关类型要求的协议允许具有指定所需基类和所需协议的类型别名,但这些也要求在编译时知道类型,因此这对您来说不太可能是一个可行的选择。

      如果你真的喜欢它,你可以用你使用的UIViewController的接口部分定义一个协议,使用扩展来增加一致性,然后使用protocol&lt;UIViewControllerProtocol, CustomProtocol&gt;

      protocol UIViewControllerProtocol {
          func isViewLoaded() -> Bool
          var title: String? { get set }
          // any other interesting property/method
      }
      
      extension UIViewController: UIViewControllerProtocol {}
      
      class MyClass {
          var controller: protocol<UIViewControllerProtocol, CustomProtocol>
      }
      

      【讨论】:

      • 确实如此。这是我们应该做的。只需定义一个包含我们可能需要的一切的协议,并扩展诸如 UIViewController 之类的东西,它已经实现了所有这些方法,以符合协议。
      • 我只是制作了类存根,随着我的进一步开发,它实际上对我来说比坚持协议更有意义。谢谢!
      • 但是如何将var controller 传递给需要 UIViewControllers 而不是 UIViewController 协议的 UIKit 方法?例如navigiationController?.viewControllers = [controller]
      • @DanielR,你将不得不投射它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多