【发布时间】:2015-11-30 19:45:45
【问题描述】:
给定以下代码:
protocol NetworkWire {
//some requirements
}
protocol EntityRESTRequest {
//some requirements
}
protocol OctupPromisable {
//some requirements
}
final class HTTPNetworkWire: NetworkWire, EntityRESTRequest, OctupPromisable {
//satisfies all requirements
}
我现在像这样创建一个函数,
extension NSManagedObject {
func post<T where T:NetworkWire, T:EntityRESTRequest, T:OctupPromisable>(navigationalProperties: String, networkWireType: T.Type = HTTPNetworkWire) -> OctupPromisable {
//some logic with valid return
}
}
编译器在 post func 上给了我一个错误,
HTTPNetworkWire.Type 的默认参数无法转换为 T.type 类型
知道这是为什么吗?虽然 HTTPNetworkWire 符合 NetworkWire、EntityRESTRequest 以及 OctupPromisable!
任何想法都会受到赞赏。运行 Xcode 7.1.1
【问题讨论】:
-
为什么需要默认类型为HTTPNetworkWire?您的函数要么适用于符合必要协议的任何类型,要么需要 HTTPNetworkWire 对象提供的特定功能。如果您依赖于 HTTPNetworkWire 对象,您可能应该创建第二个函数。
-
我想默认为 HTTPNetworkingWire 以便我可以在调用站点上提供方便,在单元测试期间我可以传入一个符合这三个协议的模拟对象,但在实际代码中,它'将默认为 HTTPNetworkWire。这样做是因为 HTTPNetworkWire 调用是可链接的(想象一下执行 Post、Put 和 Get,其中 Post、Put 和 Get 是 HTTPNetworkWire 请求)并且强制在调用站点上输入类型似乎不自然。除了用法,知道为什么它不能工作吗?
-
我认为你想做的事情是不可能的。您可以为函数参数提供默认值,但 Swift 类型系统不支持您尝试使用的功能。一个类型可以是具体的,也可以是泛型的(有或没有约束),但我不相信有办法两者兼而有之。
标签: swift generics swift2 swift-protocols