我正在尝试在Swift中实现某种委托广播器(Observer Pattern)来注册多个委托。使用" isEqual" function我需要从NSObject继承泛型
为避免重复代码,我准备了一个通用的DelegateBroadcaster:
导入UIKit
class DelegateBroadcaster<T : NSObject>: NSObject {
var delegates : [T]
override init() {
delegates = []
}
func addDelegate(newDelegate : T) {
delegates.append(newDelegate)
}
func removeDelegate(oldDelegate : T) {
for i in 0...delegates.count-1 {
if (oldDelegate.isEqual(delegates[i])) {
delegates.removeAtIndex(i)
break
}
}
}
}
并将其子类化为任何特定的广播公司。
import UIKit
class NavigationControllerBroadcaster : DelegateBroadcaster<UINavigationControllerDelegate> {
}
但是我得到一个奇怪的错误:&#34; DelegateBroadcaster要求&#39; UINavigationControllerDelegate&#39;继承自NSObject&#34;
这很奇怪,因为apple(Class Reference)的类引用说UINavigationControllerDelegate继承自NSObject。
那么为什么我会收到错误?
答案 0 :(得分:3)
您在名为NSObject
的Swift中混淆了课程NSObject
(NSObject class)和协议NSObjectProtocol
(NSObject protocol)。
UINavigationControllerDelegate
是一个协议,不能从类NSObject
继承,它继承自NSObjectProtocol
(将文档切换到Swift,你会看到差异)。
答案 1 :(得分:0)
UINavigationControllerDelegate
不是具体类型,它是协议,因此不能用作DelegateBroadcaster