如何使用通用默认参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用通用默认参数相关的知识,希望对你有一定的参考价值。

这是我的代码:

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

enum Child: String {
    case johnDoe
}

它不编译。错误是:

“Child”类型的默认参数值无法转换为“T”类型

为什么不能转换?根据docsChild.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.johnDoe as!T))其中T.RawValue == String {

}

或者让它成为可能的:

(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()

以上是关于如何使用通用默认参数的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 中的通用代码片段或模板

Android 逆向Android 逆向通用工具开发 ( Android 平台运行的 cmd 程序类型 | Android 平台运行的 cmd 程序编译选项 | 编译 cmd 可执行程序 )(代码片段

如何在 Vs Code 中更改默认自动选择的用户片段行为

Thymeleaf,片段和默认参数

如何通过代码设置片段标签?

如何从片段 KOTLIN 中调用意图 [重复]