【问题标题】:Generic IBDesginables UIView extension通用 IBDesginables UIView 扩展
【发布时间】:2017-06-22 17:09:56
【问题描述】:

我想为类创建通用扩展,以向任何 UIView 子类添加一些可设计的功能,从而避免向所有子类添加功能。因此,为 UIView 添加符合协议 SomeProtocol 的扩展会很好(它是空的,因为它只是一个标记我想要添加功能的类的标签)。然后只需在我希望实现该功能的任何 UIView 子类中添加该协议,如下所示:

protocol SomeProtocol {
  //empty
}

class BCBorderedView : UIView, SomeProtocol
{
  //empty
}

class BCBorderedSearch: UISearchBar, SomeProtocol
{
  //empty
}

我在下面的实现收到错误消息

"用于扩展非泛型类型 'UIView' 的尾随 'where' 子句"

@IBDesignable
extension UIView where Self:SomeProtocol //Error: Trailing 'where' clause for extension of non-generic type 'UIView'
{

  @IBInspectable
  public var cornerRadius: CGFloat
  {
      set (radius) {
          self.layer.cornerRadius = radius
          self.layer.masksToBounds = radius > 0
      }

      get {
          return self.layer.cornerRadius
      }
  }

  @IBInspectable
  public var borderWidth: CGFloat
  {
      set (borderWidth) {
          self.layer.borderWidth = borderWidth
      }

      get {
          return self.layer.borderWidth
      }
  }

  @IBInspectable
  public var borderColor:UIColor?
  {
    set (color) {
        self.layer.borderColor = color?.cgColor
    }

    get {
        if let color = self.layer.borderColor
        {
            return UIColor(cgColor: color)
        } else {
            return nil
        }
    }
  }
}

删除 where 子句可以编译和工作,但它会向所有 UIView 及其子类(基本上所有 UI 元素)添加功能,这会使 IB 代理在情节提要中不时崩溃。

有什么想法可以更新这个计划吗?

【问题讨论】:

    标签: ios generics swift3 swift-extensions ibdesignable


    【解决方案1】:

    extension Foo where ...只能在Foo为时使用

    • 通用类或结构
    • 包含一些相关类型的协议
    • 一种协议,我们在其中扩展了一个默认实现,用于何时 自我是特定的(对象/引用)类型,或符合某些 类型约束。

    用于扩展非泛型类型“UIView”的尾随“where”子句

    上面的错误暗示UIView是一个非泛型类类型,所以这里不能应用where子句。

    因此,您必须使用默认实现扩展 SomeProtocol,而不是尝试扩展 UIView,以应对 Self: UIView 的情况

    您的扩展应将功能扩展到符合SomeProtocol 且属于UIView 类型的所有类型

    简而言之,您应该在扩展子句中切换顺序。所以,

    extension UIView where Self : SomeProtocol
    

    应该是

    extension SomeProtocol where Self: UIView
    

    【讨论】:

    • 但是我不能使用 IBDesignables,对吧? :/ 这个扩展的主要思想是进行统一的designables声明并避免代码重复
    • 而且我仍然不得不在所有地方复制代码,这实际上一无所获。所以你实际上并没有回答这篇文章的问题
    • 好吧,我猜这个问题的初衷是想知道你得到错误的原因。我确实对问题的那一部分提供了明确的解释。我试图帮助你解决你的问题,我相信我做得对。无论如何,谢谢。
    • 如果它有助于“ IBDesignable 适用于子类,但不适用于扩展”。 stackoverflow.com/questions/29906855/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多