【问题标题】:Swift property conforming with multiple protocolsSwift 属性符合多种协议
【发布时间】:2016-11-07 21:00:48
【问题描述】:

我有符合两种不同协议的自定义 UIView (CustomView)

protocol ResizableDelegate: class {
    func view(view:UIView, didChangeHeight difference:CGFloat)
}
protocol Resizable: class {
    var delegate:ResizableDelegate? { set get }
}


protocol TappableDelegate: class {
    func viewDidTap(view:UIView)
}
protocol Tappable {
    var delegate:TappableDelegate? { set get }
}

我需要在我的CustomView 类中有一个名为delegate 的属性,并同时符合这两个协议。我读了Types conforming to multiple protocols in swift,但这并没有解决我的问题。

我创建了这个协议

protocol CustomViewDelegate: ResizableDelegate, TappableDelegate {}

然后让我的CustomView

class CustomView : UIView, Resizable, Tappable {
    var delegate:CustomViewDelegate?
}

但这导致我收到一条消息

Type 'CustomView' does not conform to protocol 'Resizable'

我不想拥有:

class CustomView : UIView, Resizable, Tappable {
   var resizableDelegate:ResizableDelegate?
   var TappableDelegate:TappableDelegate?
}

有没有什么办法两个只有一个委托属性同时符合这两个协议?我使用的是 swift 2.0,Xcode 7。

【问题讨论】:

  • 关于“符合多种协议的类型”答案的“这不能解决我的问题”是什么意思。如前所述,这看起来正是您问题的解决方案。
  • 我的类需要同时符合ResizableTappable,并且两个协议都有一个名为delegate的属性,应该符合不同的协议。

标签: ios swift swift-protocols


【解决方案1】:

我猜你真的不需要声明ResizableTappable 协议。您所需要的只是将自定义视图委托给其他对象,这对ResizableDelegateTappableDelegate 都有效,对吧?如果是这样,这应该适合你:

protocol ResizableDelegate: class {
    func view(view:UIView, didChangeHeight difference:CGFloat)
}

protocol TappableDelegate: class {
    func viewDidTap(view:UIView)
}

class CustomView : UIView {
    var delegate: (ResizableDelegate, TappableDelegate)?

}

【讨论】:

  • 只有在我从 ResizableTappable 中删除委托属性时才有效
  • @fbernaly 你确定你真的需要知道某些对象有委托吗?这并不是委托的工作方式。让我知道更新的答案是否适合您。
  • 这就是我所做的,我必须从CustomView 中删除ResizableTappable,它正在工作。但是让我解释一下为什么我希望CustomView 符合ResizableTappable:我有一些视图应该是Resizable 和/或Tappable,所以,superview 需要知道,为了成为该自定义视图的代表。
  • 所以,我想到的是:“我是你的超级视图,如果你可以调整大小,我是你的代表,如果你是可点击的,我是你的代表,否则什么都没有”,但是因为现在 CustomView 和其他自定义视图(比如说CustomView2)不是Resizable 也不是Tappable 我需要做:“我是你的超级视图,如果你是CustomView 我是你的代表,如果你是CustomView2我是你的代表,如果你是CustomView3我是你的代表......等等“......我将拥有与那些代表的类相同数量的if语句,在前一种情况下只有2个if语句
【解决方案2】:

虽然您可以保持原样,但我强烈建议您将所需的属性更改为“tappableDelegate”和“resizableDelegate”,从而在您的 View 子类中有两个单独的属性。

您的特定用例可能需要同时遵守两者,但具有相同的命名意味着您将无法拥有不同的委托。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多