具有通用参数类型的协议
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
只能处理 willDisplay
和 AMDObject
.
如果您可以自己控制协议,则可以使用 associatedtype
:
来实现
protocol ProtocolExample {
associatedtype DisplayObject: NSObject
func willDisplay(object: DisplayObject?)
}
class TableViewCell: UITableViewCell, ProtocolExample {
// Implicit typealias DisplayObject = AMDObject
func willDisplay(object: AMDObject?) {
}
}
不过,根据您使用 ProtocolExample
的方式,添加此 associatedtype
可能不是一个简单的解决方案。
我正在尝试创建一个协议,它接受从 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
只能处理 willDisplay
和 AMDObject
.
如果您可以自己控制协议,则可以使用 associatedtype
:
protocol ProtocolExample {
associatedtype DisplayObject: NSObject
func willDisplay(object: DisplayObject?)
}
class TableViewCell: UITableViewCell, ProtocolExample {
// Implicit typealias DisplayObject = AMDObject
func willDisplay(object: AMDObject?) {
}
}
不过,根据您使用 ProtocolExample
的方式,添加此 associatedtype
可能不是一个简单的解决方案。