#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. спасибо вам огромное, теперь это имеет смысл, спасибо, что прояснили это!