如何为具有类型约束的泛型函数提供默认参数?

达尔顿克莱布鲁克

以下函数定义是合法的Swift:

func doSomething<T: StringProtocol>(value: T = "abc") {
    // ...
}

编译器能够确定默认参数"abc"是a String,并且String符合StringProtocol

但是此代码无法编译:

func doSomething<T: Collection>(value: T = "abc") where T.Element == Character {
    // ...
}

编译器错误:

类型'String'的默认参数值不能转换为类型'T'

似乎编译器将拥有与第一种情况一样多的信息,以确定String确实可以转换为T此外,如果删除默认参数并以相同的值调用该函数,则它的工作原理是:

doSomething(value: "abc")

可以用不同的方式编写此函数,以便我可以提供默认String参数吗?这是Swift的局限性,还是我的思维模式的局限性?

罗布·纳皮尔

重要约束是T: ExpressibleByStringLiteral这就是允许从字符串文字中初始化某些内容的原因。

func doSomething<T: Collection>(value: T = "abc")
    where T.Element == Character, T: ExpressibleByStringLiteral {
    // ...
}

正如Leo Dabus指出的那样,T.Element == Character从技术上讲这不是必需的,但是删除它会改变含义。仅仅因为某物是一个集合并且可以用字符串文字初始化,并不意味着它的元素就是字符。

还值得注意的是,尽管所有这些都是可能的,但通常它是较差的Swift IMO。Swift没有任何方法来表示默认类型,因此doSomething()在所有这些情况下,都会导致“无法推断出通用参数'T'”。

IMO的正确解决方案是过载,它避免了所有这些问题:

func doSomething<T: StringProtocol>(value: T) {
}

func doSomething() {
    doSomething(value: "abc")
}

这使您不仅可以使默认参数成为“可以用文字初始化的东西”,还可以使"abc"您真正的意思是:默认值是字符串“ abc”。

通常,默认参数只是重载的便利,因此您通常可以用缺少该参数的显式重载替换任何默认参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

如何在没有泛型类型参数的情况下定义泛型函数?

来自分类Dev

如何确保传递给高阶函数的泛型函数具有void返回类型?

来自分类Dev

如何编写一个带有默认参数的 lambda 的泛型函数?

来自分类Dev

使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

来自分类Dev

Julia泛型函数类型参数

来自分类Dev

如何使用带有 List 参数的泛型函数

来自分类Dev

KOTLIN:如何为函数中的泛型类型参数分配默认值?

来自分类Dev

将T上具有较高类型的多个参数的泛型函数fun [T]限制为恰好为T

来自分类Dev

如何在Typescript中使用具有参数value或value []的两个参数编写泛型函数

来自分类Dev

如何为 Sequence[T] 提供泛型类型参数?

来自分类Dev

具有新类型约束的泛型构造函数

来自分类Dev

如何从Swift泛型函数捕获参数

来自分类Dev

将F#泛型函数约束为并集类型?

来自分类Dev

如何将主构造函数添加到具有类型约束的泛型类?

来自分类Dev

如何为函数参数指定泛型类型

来自分类Dev

调用非泛型函数时,如何内联提供类型注释?

来自分类Dev

Scala在子类化的泛型函数中提供类型信息

来自分类Dev

如何约束泛型类型以使其具有new()?

来自分类Dev

Swift中具有Equatable和Printable作为参数的泛型函数和属性

来自分类Dev

是否可以在C ++中将具有多个参数的泛型函数作为类中的朋友?

来自分类Dev

Swift / iOS SDK:具有类类型/名称关闭/块问题的泛型函数

来自分类Dev

rust-具有特征的泛型函数的返回类型

来自分类Dev

如何为函数中的矢量参数提供默认值

来自分类Dev

如何在Lambda中使用泛型函数接口方法类型参数

来自分类Dev

如何实现采用参数化特征的子类型并返回它的scala泛型函数

来自分类Dev

具有对其他类型参数的约束的类型参数的泛型推断

来自分类Dev

作为TypeScript中泛型函数的参数类型的void

来自分类Dev

模式匹配和(增加的)泛型函数类型参数

Related 相关文章

  1. 1

    为什么在具有可比约束的泛型函数中丢失泛型类型信息?

  2. 2

    如何在没有泛型类型参数的情况下定义泛型函数?

  3. 3

    如何确保传递给高阶函数的泛型函数具有void返回类型?

  4. 4

    如何编写一个带有默认参数的 lambda 的泛型函数?

  5. 5

    使泛型类的函数仅接受具有相同泛型类型但受更多约束的参数

  6. 6

    Julia泛型函数类型参数

  7. 7

    如何使用带有 List 参数的泛型函数

  8. 8

    KOTLIN:如何为函数中的泛型类型参数分配默认值?

  9. 9

    将T上具有较高类型的多个参数的泛型函数fun [T]限制为恰好为T

  10. 10

    如何在Typescript中使用具有参数value或value []的两个参数编写泛型函数

  11. 11

    如何为 Sequence[T] 提供泛型类型参数?

  12. 12

    具有新类型约束的泛型构造函数

  13. 13

    如何从Swift泛型函数捕获参数

  14. 14

    将F#泛型函数约束为并集类型?

  15. 15

    如何将主构造函数添加到具有类型约束的泛型类?

  16. 16

    如何为函数参数指定泛型类型

  17. 17

    调用非泛型函数时,如何内联提供类型注释?

  18. 18

    Scala在子类化的泛型函数中提供类型信息

  19. 19

    如何约束泛型类型以使其具有new()?

  20. 20

    Swift中具有Equatable和Printable作为参数的泛型函数和属性

  21. 21

    是否可以在C ++中将具有多个参数的泛型函数作为类中的朋友?

  22. 22

    Swift / iOS SDK:具有类类型/名称关闭/块问题的泛型函数

  23. 23

    rust-具有特征的泛型函数的返回类型

  24. 24

    如何为函数中的矢量参数提供默认值

  25. 25

    如何在Lambda中使用泛型函数接口方法类型参数

  26. 26

    如何实现采用参数化特征的子类型并返回它的scala泛型函数

  27. 27

    具有对其他类型参数的约束的类型参数的泛型推断

  28. 28

    作为TypeScript中泛型函数的参数类型的void

  29. 29

    模式匹配和(增加的)泛型函数类型参数

热门标签

归档