ios - 通用协议(protocol) Swift 4 错误

标签 ios iphone swift generics

以下代码曾经在 Swift 3.2 上为我工作,但在最新版本的 Swift 4 中,我遇到了一个我无法理解的奇怪错误。

我正在尝试创建一个像这样的通用协议(protocol):

public protocol FactoryComponent {
  associatedtype Argument
  associatedtype Service
  static var factory: (Resolver) -> (Argument) -> Service { get }
}

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

并在这里使用它:

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 重大更改,没有看到任何涉及通用协议(protocol)的内容。

有人可以帮我理解这是什么意思吗?

最佳答案

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

  1. 尝试创建一个实现其协议(protocol)的FactoryComponent具体类
  2. ArgumentService 在您的实现中仍然是通用的,并且需要具体类型。我的英语很差,但我希望我能帮助你。如果我的答案不清楚,请检查下面的代码。

```

class Resolver {}

protocol FactoryComponent {
  associatedtype Argument
  associatedtype Service
  static var factory: (Resolver) -> (Argument) -> Service { get }
}

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

class ConcreteFactoryComponent: FactoryComponent {
  static var factory: (Resolver) -> Factory {
    return foo
  }

  static func foo(_ resolver: Resolver) -> Factory {
    let factory: Factory = { argument in return "" }
    return factory
  }

  typealias Argument = String
  typealias Service = String
}

let factory: ConcreteFactoryComponent.Factory = { argument in return "" }

```

关于ios - 通用协议(protocol) Swift 4 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46674824/

相关文章:

iphone - 从在线 Plist 文件中获取字符串?

ios - iOS:NSProxy无法 Hook 在类本身内部调用的方法

iphone - 缩放时 UIView 未检测到触摸

ios - 需要模拟器不提供的硬件的应用程序的 iTunes App store 屏幕截图

iphone - “html agility pack” 类似 C/Objective-c/iPhone 的解决方案

ios - 在打开 UIViewController 时展开可选值时意外发现 nil

iphone - 将 key 和证书复制到另一台 Mac 以进行 iPhone 开发

ios - 如何检查 Web 服务器是否具有 SSL

ios - 点击时如何反复更改按钮?

ios - Wkwebview 对 YouTube 链接没有反应