【问题标题】:Swift delegate does not inherit NSObjectSwift 委托不继承 NSObject
【发布时间】:2016-01-21 18:08:01
【问题描述】:

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

}

并将其子类化为任何特定的广播公司。

import UIKit

class NavigationControllerBroadcaster : DelegateBroadcaster<UINavigationControllerDelegate> {

}

但我收到一个奇怪的错误:“DelegateBroadcaster 要求 'UINavigationControllerDelegate' 继承自 NSObject”

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

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

【问题讨论】:

    标签: ios swift generics delegates nsobject


    【解决方案1】:

    您混淆了类 NSObjectNSObject class) 和协议 NSObjectNSObject protocol,在 Swift 中称为 NSObjectProtocol)。

    UINavigationControllerDelegate 是一个协议,不能从NSObject 类继承,它从NSObjectProtocol 继承(将您的文档切换到 Swift,您会看到不同之处)。

    【讨论】:

    • 无论如何,我将继承切换到 NSObjectProtocol,现在它可以工作了。 显然我可以将协议用作泛型类型
    【解决方案2】:

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

    【讨论】:

    • 正如我评论 Sulthan 的回答,有可能
    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多