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

问题描述 投票:0回答:2

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

我尝试使用下面的函数来完成此操作,但是会产生编译器错误:无法调用非函数类型“ 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)
        }
    }
}
arrays swift range max min
2个回答
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!,因此也没有歧义。


0
投票

使用高阶函数的优化解决方案:

 func closestMatch(values: [Int64], inputValue: Int64) -> Int64? {
    return (values.reduce(values[0]) { abs($0-inputValue) < abs($1-inputValue) ? $0 : $1 })
}

Swift随每个版本一起前进,以优化性能和效率。使用此函数,使用高阶函数查找值数组中最接近的匹配要容易得多。根据需要更改值的类型。

© www.soinside.com 2019 - 2024. All rights reserved.