具有通用参数类型的协议

Protocols with generic parameter types

我正在尝试创建一个协议,它接受从 NSObject 继承的对象:

protocol ProtocolExample {
    func willDisplay<T: NSObject>(object: T?)
}


class TableViewCell: UITableViewCell,ProtocolExample {  
    func willDisplay<T>(object: T?) where T : NSObject {

    }

    func willDisplay(object: AMDObject?) {

    }
}

class AMDObject: NSObject {}

所以我的问题是如何应用我只需要添加第二个 willDisplay 方法而不是第一个。我怎么知道在 tableviewcell 的情况下,我的 T 当前是 AMDObject 类型(就像 T 现在是 AMDObject

ProtocolExample 中要求的签名应理解为 "a function willDisplay which accepts object, a parameter which can be of any (optional) type T? as long as T inherits from NSObject"。这个定义保证我可以编写这样的函数:

func displayThings(in example: ProtocoExample) {
    example.willDisplay(NSArray())
    example.willDisplay(NSObject())
}

但是,如果我这样写:

let cell: TableViewCell = // ...
displayThings(in: cell)

那么,displayThings 将无法调用 example.willDisplay(NSArray()),因为 TableViewCell 只能处理 willDisplayAMDObject.

如果您可以自己控制协议,则可以使用 associatedtype:

来实现
protocol ProtocolExample {
    associatedtype DisplayObject: NSObject

    func willDisplay(object: DisplayObject?)
}

class TableViewCell: UITableViewCell, ProtocolExample {
    // Implicit typealias DisplayObject = AMDObject
    func willDisplay(object: AMDObject?) {

    }
}

不过,根据您使用 ProtocolExample 的方式,添加此 associatedtype 可能不是一个简单的解决方案。