如何用Swift中浮点可转换的数组输入编写泛型函数?

时间:2015-08-28 01:25:51

标签: ios swift generics

我正在第一次尝试在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;

的参数列表

现在我知道另一个选择是创建我自己的协议,然后扩展我感兴趣的类型来采用它,但这只是感觉就像我的鼻子下面存在的东西。

1 个答案:

答案 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]