如何在Swift中选择数组中最近的元素?

时间:2015-10-19 20:42:10

标签: arrays swift range max min

我很惊讶我找不到这个线程,但我需要检查一系列特定值的数组,如果不存在,检查该值是否介于最大值和最小值之间,然后选择分配给变量的最接近,最负值。

我尝试使用下面的函数完成此操作,但它会产生编译器错误:无法调用非函数类型的值“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)
        }
    }
}

2 个答案:

答案 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正在与每个版本一起前进,以优化性能和效率。使用此函数,使用高阶函数查找值数组中最接近的匹配要容易得多。根据需要更改值的类型。