Swift委托不继承NSObject

Swift delegate does not inherit NSObject

我正在尝试在 Swift 中实现某种委托广播(观察者模式)以注册多个委托。要使用 "isEqual" 函数,我需要从 NSObject

继承的泛型

为了避免重复代码,我准备了一个通用的 DelegateBroadcaster:

import 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
        }
    }
}

}

and subclass 这适用于任何特定的广播公司。

import UIKit

class NavigationControllerBroadcaster : DelegateBroadcaster<UINavigationControllerDelegate> {

}

但是我得到一个奇怪的错误:"DelegateBroadcaster requires that 'UINavigationControllerDelegate' inherit from NSObject"

这很奇怪,因为 apple (Class Reference) 的 class 引用说 UINavigationControllerDelegate 继承自 NSObject。

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

您混淆了 class NSObjectNSObject class) and protocol NSObject (NSObject protocol,在 Swift 中称为 NSObjectProtocol)。

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

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

的类型签名