简体   繁体   English

如何转换 ClosedRange<int> 到 ClosedRange<double> 在 Swift</double></int>

[英]How to convert ClosedRange<Int> to ClosedRange<Double> in Swift

I have a ClosedRange passed in as a parameter, and now I need to convert it to a ClosedRange:我有一个 ClosedRange 作为参数传入,现在我需要将它转换为 ClosedRange:

  let range: ClosedRange<Int>
  
  init(range: ClosedRange<Int>) {
    self.range = range
  }


  var body: some View {
    Slider(value: doubleBinding, in: range.startIndex...range.endIndex, step: 1)
  }

The Slider init function takes a ClosedRange argument. Slider init function 采用 ClosedRange 参数。 So I got this error:所以我得到了这个错误:

Cannot convert value of type 'ClosedRange<Int>.Index' to expected argument type 'Double'

So I tried this:所以我尝试了这个:

  let min = Double(Int(range.startIndex))
  let max = Double(Int(range.endIndex))
  Slider(value: doubleBinding, in: min...max, step: 1)

But got this error:但是得到这个错误:

Initializer 'init(_:)' requires that 'ClosedRange<Int>.Index' conform to 'BinaryInteger'

You've used the wrong property.您使用了错误的属性。 It's not startIndex and endIndex .它不是startIndexendIndex It's lowerBound and upperBound :它是lowerBoundupperBound

Slider(value: doubleBinding, 
       in: Double(range.lowerBound)...Double(range.upperBound), 
       step: 1)

You can write a ClosedRange initialiser that conveniently does this:您可以编写一个ClosedRange初始化程序来方便地执行此操作:

extension ClosedRange {
    init<Other: Comparable>(_ other: ClosedRange<Other>, _ transform: (Other) -> Bound) {
        self = transform(other.lowerBound)...transform(other.upperBound)
    }
}

Usage:用法:

Slider(value: doubleBinding, 
       in: ClosedRange(range, Double.init), 
       step: 1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM