如何使用通用默认参数



这是我的代码:

class Person {
init<T: RawRepresentable>(raw: T = Child.johnDoe) {}
}
enum Child: String {
case johnDoe
}

它不可编译。错误为:

类型为"Child"的默认参数值无法转换为类型为"T">

为什么不能转换?根据文件,Child.someEnumRawRepresentable:

具有原始值的枚举对于任何具有字符串的枚举,整数或浮点原始类型,Swift编译器会自动添加了RawRepresentable一致性。定义自己的自定义时枚举,通过将原始类型指定为枚举的类型继承列表中的第一项。

这也编译:

class Person {
static func accept<T: RawRepresentable>(raw: T) where T.RawValue == String {}
}
enum Child: String {
case johnDoe
}
Person.accept(raw: Child.johnDoe)

为什么它不能作为默认参数工作?

用例:我想接受任何RawPresentable值,这样我就可以从中提取rawValue。我想提供一个默认值(总是")(我只是用rawValue = ""创建一个结构)。我不想创建多个初始化程序,因为我有一些子类,这会变得一团糟。对我来说,最好的方法就是提供一个默认的RawRepresentable对象。

添加演员阵容时:init(ty:T=(Child.johnDo as!T))其中T.RawValue==字符串{

}

或者让它变成nillable:

(ty: T? = nil)

它编译。但现在我不能打电话:

let x = Person()

它给出了错误:

无法推断出通用参数"T">

这当然是可能的。然而,您必须使用自己的协议,并为该协议添加默认值:

protocol MyRawRepresentable: RawRepresentable {
static var defaultValue: Self { get }
}
class Person {
init<T: MyRawRepresentable>(raw: T = T.defaultValue) {}
}
enum Child: String, MyRawRepresentable {
case johnDoe
static let defaultValue: Child = .johnDoe
}

不过还有另一个问题。如果您使用默认的参数值,并且您所拥有的只是Person.init(),您将如何指定泛型类型?

我看到的唯一解决方案是还指定一个默认的通用类型,这意味着你实际上想要:

class Person {
init<T: RawRepresentable>(raw: T) {
}
convenience init() {
self.init(raw: Child.johnDoe)
}
}

除非你真的想让Person本身成为一个泛型类,因为那样你就可以使用了

Person<Child>.init()

相关内容

  • 没有找到相关文章

最新更新