【问题标题】:Swift function with generic argument type具有通用参数类型的 Swift 函数
【发布时间】:2016-01-25 09:49:56
【问题描述】:

我正在寻找一种简单方便的方法来实现一个函数,该函数接受所有可以转换为字符串的类型,例如:myFunc("This string")myFunc(2)myFunc(true)。我认为这必须通过泛型参数来实现,并尝试了这样的方法:

func myFunc<T: StringLiteralConvertible>(param: T? = nil) -> String {
   // ...
   return "\(param)"
}

但到目前为止我没有成功。

【问题讨论】:

  • 您的测试的输出是什么?
  • 问题是该方法不接受Int和Bool作为参数
  • 您想返回 Int 和 Bool 参数的字符串吗?就像 muFunc(2) 将是 "Two" 而 myFunc(true) 将是 "true"

标签: swift generics types


【解决方案1】:

使用CustomStringConvertible,而不是StringLiteralConvertible

func myFunc<T: CustomStringConvertible>(param: T? = nil) -> String {
    // ...
    return "\(param)"
}

myFunc("Grimxn") // Optional("Grimxn")
myFunc(12) // Optional(12)
myFunc(true) // Optional(true)
myFunc(-1.234) // Optional(-1.234)
//myFunc() // doesn't work. Compiler can't infer T

这些将提供Optionals,因为您将它们转换为T? 以允许您的nil 默认值。删除默认值(它无论如何都不起作用 - nil 不能暗示 T)以摆脱 Optional

func myFunc<T: CustomStringConvertible>(param: T) -> String {
    // ...
    return "\(param)"
}

myFunc("Grimxn") // "Grimxn"
myFunc(12) // "12"
myFunc(true) // "true"
myFunc(-1.234) // "-1.234"
//myFunc((1,2)) // doesn't compile
myFunc(NSDate()) // "2015-10-26 10:44:49 +0000"

【讨论】:

  • 感谢您的建议,但这不会使类型安全变得无用,因为文档说CustomStringConvertible:“将适用于任何类型的实例,如果实例碰巧返回其描述是 CustomStringConvertible。”
  • ...所以基本上所有继承自NSObject的东西都可以通过。
  • 这是安全的,因为任何符合CustomStringConvertible的类型都可以传递,否则代码将无法编译。
猜你喜欢
  • 2019-01-07
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2015-11-01
相关资源
最近更新 更多