我正在嘗試在 SwiftUI 視圖中使用 NumberFormatter,但出現編譯器錯誤。這是我的代碼:
import Foundation
import SwiftUI
struct AccountCard: View {
var netWorth: NetWorth
let formatter = NumberFormatter()
formatter.numberStyle = .currency
let investmentTotalString = formatter.string(for: netWorth.investmentTotal)
var body: some View {
VStack {
Text(netWorth.name)
Text(String(format: "%.2f", netWorth.investmentTotal))
Text(String(format: "%.2f", netWorth.cashBalance))
}
}
}
struct AccountCard_Previews: PreviewProvider {
static var previews: some View {
AccountCard(netWorth: netWorths[0])
}
}
我究竟做錯了什么?
這是顯示錯誤的 XCode:

uj5u.com熱心網友回復:
我們不再自己格式化字串,而是讓 SwiftUI 為我們完成。這樣做的原因是,如果用戶更改其區域設定,它可以更新螢屏上的標簽。使用 UIKit,我們大多數人都不會費心去聽語言環境更改通知來做這件事。
我們可以簡單地告訴 SwiftUI 我們想要什么格式:
struct AccountCard: View {
let netWorth: NetWorth
var body: some View {
VStack {
Text(netWorth.name)
Text(netWorth.investmentTotal, format: .currency(code: "USD"))
Text(netWorth.cashBalance, format: .currency(code: "USD"))
}
}
}
或者我們可以將格式化程式物件傳遞給字串插值:
let currencyFormatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
return formatter
}()
struct AccountCard: View {
let netWorth: NetWorth
var body: some View {
VStack {
Text(netWorth.name)
Text("$\(netWorth.investmentTotal, formatter: currencyFormatter)")
Text("$\(netWorth.cashBalance, formatter: currencyFormatter)")
}
}
}
uj5u.com熱心網友回復:
SwiftUI 不允許在其設定中使用陳述句,例如formatter.numberStyle = .currency. 視圖中有一些地方,init(),例如.onAppear{},當然還有任何自定義函式,允許這樣的宣告。
為了實作你想要的,你可以嘗試這樣的事情:
struct AccountCard: View {
var netWorth: NetWorth
let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
return formatter
}()
@State var investmentTotalString: String?
var body: some View {
VStack {
Text(netWorth.name)
Text(String(format: "%.2f", netWorth.investmentTotal))
Text(String(format: "%.2f", netWorth.cashBalance))
}
.onAppear {
investmentTotalString = formatter.string(for: netWorth.investmentTotal)
}
}
}
uj5u.com熱心網友回復:
基于 workingdog 所寫的內容,創建NumberFormatter是一項昂貴的操作,因此您應該將其設為靜態,這樣就不必一直重新創建它。是否需要 State 也是值得懷疑的,你總是可以用 getter 將它宣告為 only var。
struct AccountCard: View {
var netWorth: NetWorth
static let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .currency
return formatter
}()
var investmentTotalString: String {
AccountCard.formatter.string(for: netWorth.investmentTotal)
}
var body: some View {
VStack {
Text(netWorth.name)
Text(String(format: "%.2f", netWorth.investmentTotal))
Text(String(format: "%.2f", netWorth.cashBalance))
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420331.html
標籤:
