Преобразование единиц измерения и форматирование с помощью функции MeasurementFormatter SwiftUI

#ios #swift #xcode #swiftui

Вопрос:

Здравствуйте, я действительно новичок в SwiftUI и особенно в конвертации uints. Я пытаюсь преобразовать inches в feet , а затем использовать MeasurementFormatter() для отображения значения как feet десятичное, а не десятичное. По какой-то причине я продолжаю получать ошибку в своем коде при попытке присвоить мое выходное значение строке из formatter . Буду рад любым предложениям, которые у кого-либо есть.

Функциональный код:

 func convertToFeet() {
        let formatter = MeasurementFormatter()
        var distanceInFeet = Measurement(value: Double(inputValue) ?? 0, unit: UnitLength.inches)
        distanceInFeet.convert(to: UnitLength.feet)
        //formatter.unitStyle = MeasurementFormatter.UnitStyle.long
        formatter.string(from: distanceInFeet) // 3,626.81 miles
        
        outputValue = formatter.description
    }
 

это моя функция

Весь Код:

 //
//  ContentView.swift
//  AC Converstion
//
//  Created by Luke Jamison on 11/7/21.
//

import SwiftUI
import Foundation


struct ContentView: View {
    
    @State private var inputValue = ""
    @State private var outputValue = ""
    @State var value: Double = 0
    @State var length: Measurement = .init(value: 1, unit: UnitLength.inches)
    private var massFormatter = MeasurementFormatter()
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                Text("(outputValue)").font(.title2)
                Form {
                    Section(header: Text("Inches to Feet")) {
                        TextField("Enter Inches", text: $inputValue).keyboardType(.decimalPad)
                        Button(action: {
                            self.convertToFeet()
                        }, label: {
                            Label("Convert", systemImage: "car")
                        })
                    }
                }.navigationTitle("Convert")
            }
            
            
        }
        
    }
    func convertToFeet() {
        let formatter = MeasurementFormatter()
        var distanceInFeet = Measurement(value: Double(inputValue) ?? 0, unit: UnitLength.inches)
        distanceInFeet.convert(to: UnitLength.feet)
        //formatter.unitStyle = MeasurementFormatter.UnitStyle.long
        formatter.string(from: distanceInFeet) // 3,626.81 miles
        
        outputValue = formatter.description
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
 

Ответ №1:

В общем description случае свойство в Swift следует использовать только для целей отладки. Его значение не гарантируется согласованностью в разных версиях определенного класса.

Правильный способ получить строковое значение из форматера измерений-вызвать string(from:) функцию, как вы это делаете. Эта функция возвращает строку. Вы ничего не делаете с возвращаемым строковым значением, о чем вас предупреждает компилятор.

Вместо того, чтобы полагаться на побочные эффекты, я бы изменил вашу функцию, чтобы она принимала входной параметр и возвращала значение.

Вам также нужно будет установить свойство форматирования unitOptions .providedUnit в значение, чтобы гарантировать, что вы получите вывод в футах; Если вы этого не сделаете, вы получите вывод, зависящий от конкретной локали (т. Е. Километры в метрических локалях).

 struct ContentView: View {
    
    @State private var inputValue = ""
    @State private var outputValue = ""
    @State var value: Double = 0
    @State var length: Measurement = .init(value: 1, unit: UnitLength.inches)
    private var massFormatter = MeasurementFormatter()
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                Text("(outputValue)").font(.title2)
                Form {
                    Section(header: Text("Inches to Feet")) {
                        TextField("Enter Inches", text: $inputValue).keyboardType(.decimalPad)
                        Button(action: {
                            self.outputValue = self.convertToFeet(inches: self.inputValue)
                        }, label: {
                            Label("Convert", systemImage: "car")
                        })
                    }
                }.navigationTitle("Convert")
            }
        }
    }
    
    func convertToFeet(inches: String)-> String {
        
        let formatter = MeasurementFormatter()
        
        var distanceInFeet = Measurement(value: Double(inches) ?? 0, unit: UnitLength.inches)
        
        distanceInFeet.convert(to: UnitLength.feet)
        formatter.unitOptions = .providedUnit

        return formatter.string(from: distanceInFeet)
    }
    
}
 

Комментарии:

1. спасибо вам огромное, теперь это имеет смысл, спасибо, что прояснили это!