Search code examples
iosswiftgenericsdelegatesnsobject

Swift delegate does not inherit NSObject


I am trying to implement some sort of delegate broadcaster (Observer Pattern) in Swift to register multiple delegates. To use the "isEqual" function I need the generic to inherit from NSObject

To avoid duplicate code I prepared a generic 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 this for any specific broadcaster.

import UIKit

class NavigationControllerBroadcaster : DelegateBroadcaster<UINavigationControllerDelegate> {

}

But I get a strange error: "DelegateBroadcaster requires that 'UINavigationControllerDelegate' inherit from NSObject"

This is strange because the class reference by apple (Class Reference) says that UINavigationControllerDelegate inherits from NSObject.

So why do I get an error?


Solution

  • You are confusing class NSObject (NSObject class) and protocol NSObject (NSObject protocol, in Swift called NSObjectProtocol).

    UINavigationControllerDelegate is a protocol and cannot inherit from class NSObject, it inherits from NSObjectProtocol (switch your documentation to Swift, you will see the difference).