如何从一个范围内的数字插入到另一个范围内的相应值?

Jac*_*sta 1 integer range swift

我目前收到的 Int 可能介于 0 和 180,000 之间。我需要改变它以适应 0 到 3000。我知道在其他语言中你可以使用类似的东西

Map(min1,max1,min2,max2,input)
Run Code Online (Sandbox Code Playgroud)

我似乎无法在 swift 中找到类似的东西。这是我目前拥有的,但它总是返回 0。

var newY = [(Int)(input)]
newY = newY.map {_ in 0 * 3000}
print(newY[0])
Run Code Online (Sandbox Code Playgroud)

我想我使用了错误的功能。我以前从未在 Swift 中做过任何映射。

Dav*_*rry 7

map集合上的函数将做一些非常不同的事情。它将映射函数应用于集合的每个元素,并根据结果返回一个新集合。

你要找的是:

func map(minRange:Int, maxRange:Int, minDomain:Int, maxDomain:Int, value:Int) -> Int {
    return minDomain + (maxDomain - minDomain) * (value - minRange) / (maxRange - minRange)
}

print(map(minRange: 0, maxRange: 1800000, minDomain: 0, maxDomain: 3000, value: 200000))
Run Code Online (Sandbox Code Playgroud)

只需多做一点工作,您就可以使其在所有整数类型上通用:

func map<T:IntegerArithmetic>(minRange:T, maxRange:T, minDomain:T, maxDomain:T, value:T) -> T {
    return minDomain + (maxDomain - minDomain) * (value - minRange) / (maxRange - minRange)
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是利用 SwiftRange类型使调用更加简洁:

func map<T:IntegerArithmetic>(range:Range<T>, domain:Range<T>, value:T) -> T {
    return domain.lowerBound + (domain.upperBound - domain.lowerBound) * (value - range.lowerBound) / (range.upperBound - range.lowerBound)
}

map(range:0..<3000, domain:0..<180000, value: 1500)
Run Code Online (Sandbox Code Playgroud)