我正在第一次尝试在Swift中编写泛型函数。我想要做的是编写一个函数,它接受任何类型的数组输入,只要该类型可以转换为浮点数。我想知道我是否可以利用一些Swift标准库协议来做到这一点。这是一个简单的例子(我正在搜索用作ConvertibleToFloatingPointTypeProtocol
的内容):
func toDoubleArray<T: ConvertibleToFloatingPointTypeProtocol>(array: [T]) -> [Double] {
var doubleArray = [Double]()
for arrayItem in array {
doubleArray.append(Double(arrayItem))
}
return doubleArray
}
当我尝试FloatingPointType
等时,我从中得到的编译器错误是:&#34;找不到类型&#39; Double&#39;的初始值设定项。接受类型&#39;(T)&#39;&#34;
现在我知道另一个选择是创建我自己的协议,然后扩展我感兴趣的类型来采用它,但这只是感觉就像我的鼻子下面存在的东西。
答案 0 :(得分:0)
尝试FloatLiteralConvertible
:
import Darwin
// Swift 2.0
func toDoubleArray<T : FloatLiteralConvertible>(arr : [T]) -> [Double] {
return arr.flatMap { $0 as? Double }
}
// Swift 1.2
func toDoubleArray<T : FloatLiteralConvertible>(arr : [T]) -> [Double] {
var result = [Double]()
for a in arr {
if let d = a as? Double {
result.append(d)
}
}
return result
}
let a = toDoubleArray([1, 2, 3])
let b = toDoubleArray([M_PI, 2 as Int, 3.3])
let c = toDoubleArray(["a", "b", "c"]) // Error, cannot convert [String] to [Double]
let d = toDoubleArray([1, 2, 3, "a"]) // Error, cannot convert [NSObject] to [Double]