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 中做过任何映射。
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)