我在創建變數時遇到問題。這是我想做的一個例子:
我在 [ ] 中有 JSON 資料。我在選擇器中選擇 smth,這會改變pickerSelection1,我可以在視圖中顯示這個字串。代碼如下所示:
var cc1: String {
guard api.currencyCode1.count > 0 else {
return "err"
}
let cc1 = api.currencyCode1[pickerSelection1]
return cc1
}
這是我在新專案中嘗試做的事情:
var cc1: String {
guard api.currencies.count > 0 else {
return "err"
}
ForEach(api.currencies, id: \.self) { cc1 in // BUG: Static method 'buildBlock' requires that 'String.SubSequence' (aka 'Substring') conform to 'AccessibilityRotorContent'
let cc1 = cc1.currencyCode[$pickerSelection1] // BUG: Subscript 'subscript(_:)' requires that 'Binding<Int>' conform to 'RangeExpression'
cc1
}
}
我很確定我做錯了,我不應該使用: String { }. 需要你的建議,女士們,先生們。
PS:這是整個代碼:
// Model
import Foundation
struct CurrencyModel: Codable {
var results: [String:Double]
}
struct CurrencyNewModel: Codable {
var currencies: [String:String]
}
struct Currency: Codable, Hashable {
let currencyCode: String
let fullName: String
var price: Double
}
// ViewModel
import SwiftUI
class CurrencyViewModel: ObservableObject {
@Published var currencies: [Currency] = []
init() {
fetchNewData { [self] (currency) in
switch currency {
case .success(let names):
print("Success")
DispatchQueue.main.async {
self.currencies = names.currencies.map {
Currency(currencyCode: $0.key, fullName: $0.value, price: 0)
}
}
fetchData { result in
switch result {
case .success(let prices):
print("Success")
for (index, value) in currencies.enumerated() {
if let price = prices.results.first(where: { $0.key == value.currencyCode }) {
DispatchQueue.main.async {
currencies[index].price = price.value
}
}
}
case .failure(let error):
print(error)
}
}
case .failure(let error):
print("Error", error)
}
}
}
func fetchData(completion: @escaping (Result<CurrencyModel,Error>) -> ()) {
guard let url = URL(string: "https://api.fastforex.io/fetch-all?from=USD&api_key=7ffe65c2ef-926f01d9e8-r7eql2") else { return }
URLSession.shared.dataTask(with: url) { data, responce, error in
if let error = error {
completion(.failure(error))
return
}
guard let safeData = data else { return }
do {
let currency = try JSONDecoder().decode(CurrencyModel.self, from: safeData)
completion(.success(currency))
}
catch {
completion(.failure(error))
}
}
.resume()
}
func fetchNewData(completion: @escaping (Result<CurrencyNewModel,Error>) -> ()) {
guard let url = URL(string: "https://api.fastforex.io/currencies?api_key=7ffe65c2ef-926f01d9e8-r7eql2") else { return }
URLSession.shared.dataTask(with: url) { data, responce, error in
if let error = error {
completion(.failure(error))
return
}
guard let safeData = data else { return }
do {
let currency = try JSONDecoder().decode(CurrencyNewModel.self, from: safeData)
completion(.success(currency))
}
catch {
completion(.failure(error))
}
}
.resume()
}
}
// View
import SwiftUI
struct CurrencyView: View {
@StateObject var api = CurrencyViewModel()
@State var pickerSelection1 = 1
@State var pickerSelection2 = 1
var body: some View {
VStack {
Picker("", selection: $pickerSelection1) {
ForEach(api.currencies, id: \.self) { c1 in
Text(c1.currencyCode " " c1.fullName)
}
}
.id(UUID())
.labelsHidden()
Picker("", selection: $pickerSelection2) {
ForEach(api.currencies, id: \.self) { c2 in
Text(c2.currencyCode " " c2.fullName)
}
}
.id(UUID())
.labelsHidden()
}
}
var cc1: String {
guard api.currencies.count > 0 else {
return "err"
}
ForEach(api.currencies, id: \.self) { cc1 in
let cc1 = cc1.currencyCode[$pickerSelection1]
cc1
}
}
}
struct CurrencyView_Previews: PreviewProvider {
static var previews: some View {
CurrencyView()
}
}
uj5u.com熱心網友回復:
ForEach僅用于回傳Views
你應該使用
for cc1 in api.currencies{
//The rest of your code
}
并且pickerSelection1不使用$
另一個問題可能是型別與 的pickerSelection1型別不匹配c1。
它們應該匹配,否則操作的選擇部分將無法按您的預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/429696.html
