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
我正在尝试为我的 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