令我惊讶的是,我找不到一个线程,但是我需要检查一系列数组以获取特定值,如果不存在,请检查该值是否介于最大值和最小值之间,然后选择最接近的值。 ,是分配给变量的最负值。
我尝试使用下面的函数来完成此操作,但是会产生编译器错误:无法调用非函数类型“ 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)
}
}
}
有什么方法可以克服编译器错误,还是应该尝试其他方法?
首先,值得注意的是,行为很大程度上取决于您所使用的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!
,因此也没有歧义。
使用高阶函数的优化解决方案:
func closestMatch(values: [Int64], inputValue: Int64) -> Int64? {
return (values.reduce(values[0]) { abs($0-inputValue) < abs($1-inputValue) ? $0 : $1 })
}
Swift随每个版本一起前进,以优化性能和效率。使用此函数,使用高阶函数查找值数组中最接近的匹配要容易得多。根据需要更改值的类型。