SwiftUI Picker,将 String 转换为 Double

Posted

技术标签:

【中文标题】SwiftUI Picker,将 String 转换为 Double【英文标题】:SwiftUI Picker, converting String to a Double 【发布时间】:2019-07-10 09:02:02 【问题描述】:

我正在使用 SwiftUI 并有一个 Picker 选择数组中的一些字符串,这些字符串是数字.. 选择器运行良好,我可以在屏幕上显示值,但是我需要能够将数组中的选定字符串设置为 Double。

我敢肯定有一些非常善良和聪明的人可以帮助我..

我想设置:

var totalFrequency : Double = 0.0

来自 Picker 的两个值。

谢谢!!!

克雷格

import SwiftUI

struct DipoleSelect : View 
  @State var mhzValueIndex = 0
  @State var mhzValueStepIndex = 0
  var frequencyValue = ["1", "2", "3", "4", "5", "6", "7", "8", "9" ]
  var frequencyStep = [".000", ".005", ".010"]
  var totalFrequency : Double = 0.0

  var body: some View 

    VStack 

      Text("Select Frequency")
        .font(.largeTitle)
        .fontWeight(.heavy)
        .padding([.top,], -180.0)

      Picker(selection: $mhzValueIndex, label: Text("")) 
        ForEach(0 ..< frequencyValue.count) 
          Text(self.frequencyValue[$0] + " mhz").font(.largeTitle).fontWeight(.semibold).color(Color.black).tag($0)
        .font(.title)

      .padding(.top, -170)

      Picker(selection: $mhzValueStepIndex, label: Text("")) 
        ForEach(0 ..< frequencyStep.count) 
          Text(self.frequencyStep[$0]).tag($0)
        

      .padding()

      Text("You Selected \(frequencyValue[mhzValueIndex])\(frequencyStep[mhzValueStepIndex]) Mhz")

    

  


【问题讨论】:

你能解释一下你想要什么吗?问题不清楚。 Sorry.. var totalFrequency : Double = 0.0 希望从 Picker 的两个变量中设置。 (frequencyValue[mhzValueIndex]) (frequencyStep[mhzValueStepIndex]) 所以每个选择器都会显示值从数组中,我将它们显示在 Text 中,并希望能够从选择器中获取这些数字并将其设置为 Double ... 例如,一个选择器显示数字 1 到 9,另一个选择器显示数字 .000, .005, .010...所以如果两个选择器选择说 7.005 它是一个字符串,但是我希望将其转换为双精度数。希望这是有道理的...感谢您抽出宝贵的时间。 【参考方案1】:

我想出了这个解决方案。希望它对你有用。

final class Property: BindableObject 
    var didChange = PassthroughSubject<Property, Never>()

    var frequencyValue = ["1", "2", "3", "4", "5", "6", "7", "8", "9" ]
    var frequencyStep = [".000", ".005", ".010"]

    var mhzValueIndex: Int = 0 
        didSet
            totalFrequency = totalFrequency + getDouble(value: frequencyValue[mhzValueIndex])
            didChange.send(self)

        
    

    var mhzValueStepIndex: Int = 0 
        didSet 
            totalFrequency = totalFrequency + getDouble(value: frequencyStep[mhzValueStepIndex])
            didChange.send(self)
        
    

    var totalFrequency: Double = 0.0 
        didSet
            didChange.send(self)
        
    

    func getDouble(value: String) -> Double 
        return  Double(value)!
    


struct DipoleSelect : View 

    @EnvironmentObject var property: Property

    var body: some View 

        VStack 

            Text("Select Frequency")
            .font(.largeTitle)
            .fontWeight(.heavy)
            .padding()

            Picker(selection: $property.mhzValueIndex, label: Text("")) 
                ForEach(0 ..< property.frequencyValue.count) 
                    Text(self.property.frequencyValue[$0] + " mhz").font(.largeTitle).fontWeight(.semibold).color(Color.black).tag($0)
                .font(.title)

            

            Picker(selection: $property.mhzValueStepIndex, label: Text("")) 
                ForEach(0 ..< property.frequencyStep.count) 
                    Text(self.property.frequencyStep[$0]).tag($0)
                

            


            Text("You Selected \(property.frequencyValue[property.mhzValueIndex])\(property.frequencyStep[property.mhzValueStepIndex]) Mhz")


            Text("Total frequency: \(property.totalFrequency)")

       

    



【讨论】:

我不认为totalFrequency 应该像你在这里那样是累积的。每个didSet 应该是totalFrequency = getDouble(value: frequencyValue[mhzValueIndex]) + getDouble(value: frequencyStep[mhzValueStepIndex]) 如何计算总频率,取决于 getDouble() 方法。我只是试图展示一种方法来做到这一点。你可以改变方法。 哇。这看起来很复杂......但我会试一试......非常感谢您提供的惊人帮助。干杯。

以上是关于SwiftUI Picker,将 String 转换为 Double的主要内容,如果未能解决你的问题,请参考以下文章

将 SwiftUI Picker 绑定到字典中保存的值

SwiftUI Picker 专注于视图中的选定项目

在 SwiftUI 的 Picker 中添加新元素

为 SwiftUI 寻找一个简单的自定义视图:picker

在 SwiftUI 中隐藏 Picker 在 watchOS 上的焦点边界

SwiftUI Picker 视图中不显示值