Swift委托不继承NSObject

时间:2016-01-21 18:08:02

标签: ios swift generics delegates nsobject

我正在尝试在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。

那么为什么我会收到错误?

2 个答案:

答案 0 :(得分:3)

您在名为NSObject的Swift中混淆了课程NSObjectNSObject class)和协议NSObjectProtocolNSObject protocol)。

UINavigationControllerDelegate是一个协议,不能从类NSObject继承,它继承自NSObjectProtocol(将文档切换到Swift,你会看到差异)。

答案 1 :(得分:0)

UINavigationControllerDelegate不是具体类型,它是协议,因此不能用作DelegateBroadcaster

的类型签名