Swift RawRepresentable 上的扩展没有可访问的初始值设定项

Swift extension on RawRepresentable has no accessible initializer

我正在尝试为我的 FieldIdentifiable 协议创建一个扩展,仅当实现它的枚举具有 Int 的 RawValue 时。唯一的问题是 return FieldIdItem(rawValue: newValue) 行一直显示此错误:

'Self.FieldIdItem' cannot be constructed because it has no accessible initializers

这是 Swift 错误还是我遗漏了什么?

enum SignUpField: Int, FieldIdentifiable {
  case Email = 0, Password, Username

  typealias FieldIdItem = SignUpField
}

protocol FieldIdentifiable {
  typealias FieldIdItem

  func next() -> FieldIdItem?
  func previous() -> FieldIdItem?
}

extension FieldIdentifiable where Self: RawRepresentable, Self.RawValue == Int {

  func next() -> FieldIdItem? {
    let newValue: Int = self.rawValue+1
    return FieldIdItem(rawValue: newValue)
  }

  func previous() -> FieldIdItem? {
    return FieldIdItem(rawValue: self.rawValue-1)
  }
}

extension FieldIdentifiable where Self: RawRepresentable, Self.RawValue == Int { ... }

Self 的关联类型 FieldIdItem 不是(必然) RawRepresentable,这就是

的原因
FieldIdItem(rawValue: newValue)

不编译。您可以通过添加额外的约束来解决这个问题:

extension FieldIdentifiable where Self: RawRepresentable, Self.RawValue == Int,
Self.FieldIdItem : RawRepresentable, Self.FieldIdItem.RawValue == Int { ... }

但是,如果 next()previous() 方法实际上应该 return 个 相同类型 的实例,那么您不需要 关联类型,并且可以使用 Self 作为协议中的 return 类型:

enum SignUpField: Int, FieldIdentifiable {
    case Email = 0, Password, Username
}

protocol FieldIdentifiable {

    func next() -> Self?
    func previous() -> Self?
}

extension FieldIdentifiable where Self: RawRepresentable, Self.RawValue == Int {

    func next() -> Self? {
        return Self(rawValue: self.rawValue + 1)
    }

    func previous() -> Self? {
        return Self(rawValue: self.rawValue - 1)
    }
}

另请注意约束

Self.RawValue == Int

可以稍微放宽到

Self.RawValue : IntegerType