【发布时间】:2016-07-26 22:12:30
【问题描述】:
我正在尝试从协议扩展中覆盖实例方法,但遇到了一些麻烦。
就上下文而言,我正在制作一个带有许多不同 UICollectionViews 的 iOS 应用程序。这些视图从不同的数据库中获取数据(需要不同的回调函数)并且具有非常不同的布局。因为(数据库、布局)的任何组合都是可能的,所以很难在没有大量代码重复的情况下创建一个漂亮的 OOP 类层次结构。
我的想法是将布局功能(主要是在 UICollectionViewDelegateFlowLayout 协议中定义的那些)放入协议扩展中,因此我可以使用扩展以实现所有相关布局功能的协议来装饰给定的 UICollectionView 子类,但我有很难过。问题的实质包含在下面的代码中。
class Base {
func speak(){
print("Base")
}
}
class SubA: Base, ProtocolA {}
class SubB: Base, MyProtocolB {}
protocol MyProtocolA{
func speak()
}
protocol MyProtocolB{
func speak()
}
extension MyProtocolA{
func speak(){
print("A")
}
}
extension MyProtocolA{
func speak(){
print("B")
}
}
let suba = SubA()
suba.speak() // prints "Base", I want it to print "A"
let subb = SubB()
subb.speak() // prints "Base", I want it to print "B"
想法?
【问题讨论】:
-
“我的想法是将布局函数(主要是那些在 UICollectionViewDelegateFlowLayout 协议中定义的函数)放入协议扩展” 忘记这个想法。 Objective-C 永远不会从协议扩展调用实现,因为 Objective-C 不能看到协议扩展。这是 Swift 独有的功能。
-
@matt 这个问题不是关于 Obj-C 的,不是吗?
-
@TimVermeulen 是的。这是关于 Swift 协议扩展中的 Objective-C 委托方法。
标签: ios swift protocols swift-protocols swift-extensions