2015-08-28 19 views
0

我正在将我的第一次入侵写入Swift中编写泛型函数。我试图做的是编写一个函数,只要该类型可以转换为浮点数就可以接受任何类型的数组输入。我想知道如果我可以利用一些Swift标准库协议来做到这一点。这里是(我在寻找什么作为ConvertibleToFloatingPointTypeProtocol使用)一个简单的例子:如何在Swift中使用浮点数组的输入数组写入泛型函数?

func toDoubleArray<T: ConvertibleToFloatingPointTypeProtocol>(array: [T]) -> [Double] { 
    var doubleArray = [Double]() 
    for arrayItem in array { 
     doubleArray.append(Double(arrayItem)) 
    } 
    return doubleArray 
} 

的编译器错误,我从这个获得当我尝试FloatingPointType等是:“无法找到类型的初始化‘双师型’它接受类型'(T)'的参数列表“

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

+1

我不认为这样的事情在STDLIB存在,但你可以创建自己的协议。 – jtbandes

+0

谢谢@ jtbandes,我知道我可以走这条路线,我只是确信这必须已经存在。 –

回答

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] 
+0

在操场上试用这个,我得到“不能用类型为'((_) - > _''' –

+1

'(1为Int)的参数列表调用'flatMap'为?双'返回为零。 – jtbandes

+0

@ScottH应该提到我在Swift 2.0中测试过它。对于1.2,'flatMap'不能识别输入和返回类型。不得不用老式的循环来代替它。 –