【问题标题】:swift 2 Func Default Type Argumentswift 2 Func 默认类型参数
【发布时间】: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


【解决方案1】:

您应该使用不带泛型的Protocol Composition

extension NSManagedObject {

    func post(navigationalProperties: String, networkWireType: protocol<NetworkWire, EntityRESTRequest, OctupPromisable>.Type = HTTPNetworkWire.self) -> OctupPromisable {
        //some logic with valid return
    }

}

【讨论】:

  • 太棒了!它就像一个魅力。不知道协议组成。非常感谢!
猜你喜欢
  • 2017-09-11
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多