首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用协议Swift 4错误

通用协议Swift 4错误
EN

Stack Overflow用户
提问于 2017-10-10 19:49:45
回答 2查看 187关注 0票数 0

下面的代码用于我在SWIFT3.2中工作,但是随着Swift 4的最新发布,我得到了一个奇怪的错误,我无法理解。

我正在尝试创建一个类似这样的通用协议:

代码语言:javascript
复制
public protocol FactoryComponent {
  associatedtype Argument
  associatedtype Service
  static var factory: (Resolver) -> (Argument) -> Service { get }
}

public extension FactoryComponent {
    public typealias Factory = (Argument) -> Service
}

在这里使用它:

代码语言:javascript
复制
public extension Container {
  @discardableResult
  public func register<Component: FactoryComponent>(
    factory componentType: Component.Type
  ) -> ServiceEntry<Component.Factory> { // On this line the error shows
    return self.register(componentType.Factory.self) { resolver in
      componentType.factory(resolver)
    }
  }
}

错误:

'Component‘没有一个名为“Factory”的成员类型;您的意思是“工厂”吗?

当然,自动修复没有帮助,因为错误是无用的.

我查看了Swift 4的破坏更改,没有看到任何涉及通用协议的内容。

有人能帮我理解一下这是什么意思吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-10 20:35:20

似乎缺少一个具体的FactoryComponent类。Factory类型别名只能由协议的具体类调用。

  1. 尝试创建一个实现其协议的FactoryComponent具体类
  2. ArgumentService在您的实现上仍然是通用的,需要一个具体的类型。我的英语很差,但我希望我一直在帮助你。如果我的答案不清楚,请检查下面的代码。
代码语言:javascript
复制
```javascript

类解析器{}

协议FactoryComponent {

关联类型参数

关联类型服务

静态变量工厂:(Resolver) -> (参数) ->服务{ get }

}

扩展FactoryComponent {

类型工厂=(参数) ->服务

}

类ConcreteFactoryComponent: FactoryComponent {

静态变量工厂:(Resolver) ->工厂{

代码语言:javascript
复制
return foo

}

静态函数foo(_解析器: Resolver) ->工厂{

代码语言:javascript
复制
let factory: Factory = { argument in return "" }
代码语言:javascript
复制
return factory

}

类型参数=字符串

类型服务=字符串

}

设工厂: ConcreteFactoryComponent.Factory ={参数返回"“}

代码语言:javascript
复制
票数 0
EN

Stack Overflow用户

发布于 2017-10-10 20:41:58

我相信错误并不是真正与返回类型有关。由于@转义的新默认值,Swift 4中通用签名解析的处理略有改变。函数调用具有与函数本身相同签名的self.register函数的事实很可能是问题的根源。

从其他类似的例子中,我建议查看Container.register的签名。如果它碰巧有一个@转义闭包,那么扩展中的泛型函数的签名也应该有一个,以便将它识别为重载。

见本文:https://stackoverflow.com/a/43081214/5237560

编辑:我刚刚意识到这个变化是在Swift 2和3之间,如果它能提供一些灵感,就把答案留在这里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46674824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档