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 NSObject
(NSObject class) and protocol NSObject
(NSObject protocol,在 Swift 中称为 NSObjectProtocol
)。
UINavigationControllerDelegate
是一个协议,不能继承自class NSObject
,它继承自NSObjectProtocol
(将你的文档切换到Swift,你会看到差异)。
UINavigationControllerDelegate
不是具体类型,它是协议,因此不能用作 DelegateBroadcaster
的类型签名
我正在尝试在 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 NSObject
(NSObject class) and protocol NSObject
(NSObject protocol,在 Swift 中称为 NSObjectProtocol
)。
UINavigationControllerDelegate
是一个协议,不能继承自class NSObject
,它继承自NSObjectProtocol
(将你的文档切换到Swift,你会看到差异)。
UINavigationControllerDelegate
不是具体类型,它是协议,因此不能用作 DelegateBroadcaster