我很惊讶我找不到这个线程,但我需要检查一系列特定值的数组,如果不存在,检查该值是否介于最大值和最小值之间,然后选择分配给变量的最接近,最负值。
我尝试使用下面的函数完成此操作,但它会产生编译器错误:无法调用非函数类型的值“Float!”
有没有办法克服编译器错误,或者我应该尝试不同的方法?
func nearestElement(powerD : Float, array : [Float]) -> Float {
var n = 0
var nearestElement : Float!
while array[n] <= powerD {
n++;
}
nearestElement = array[n] // error: Cannot call value of non-function type "Float!"
return nearestElement;
}
当我在arrayContains()中检查每个数组时,我想调用nearestElement():
func arrayContains(array: [Float], powerD : Float) {
var nearestElement : Float!
if array.minElement() < powerD && powerD < array.maxElement() {
if array.contains(powerD) {
contactLensSpherePower = vertexedSpherePower
} else {
contactLensSpherePower = nearestElement(powerD, array)
}
}
}
答案 0 :(得分:4)
有没有办法克服编译器错误,或者我应该尝试不同的方法?
首先,值得注意的是,行为在很大程度上取决于您使用的Swift版本。
一般而言,您的问题是将变量命名为与方法相同:
func nearestElement(powerD : Float, array : [Float]) -> Float {
var n = 0
var nearestElement : Float! //<-- this has the same name as the function
while array[n] <= powerD {
n++;
}
nearestElement = array[n] // error: Cannot call value of non-function type "Float!"
return nearestElement;
}
另外,在arrayContains
中,您还要重命名var nearestElement : Float!
,以便在那里也没有歧义。
答案 1 :(得分:1)
使用高阶函数的优化解决方案:
func closestMatch(values: [Int64], inputValue: Int64) -> Int64? {
return (values.reduce(values[0]) { abs($0-inputValue) < abs($1-inputValue) ? $0 : $1 })
}
Swift正在与每个版本一起前进,以优化性能和效率。使用此函数,使用高阶函数查找值数组中最接近的匹配要容易得多。根据需要更改值的类型。