Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SwiftUI中从URL获取JSON_Json_Swift_Swiftui - Fatal编程技术网

在SwiftUI中从URL获取JSON

在SwiftUI中从URL获取JSON,json,swift,swiftui,Json,Swift,Swiftui,下面是我正在尝试使用的代码,我只想显示当前价格和货币 该链接返回以下格式: {“货币”:“美元”,“汇率”:“178.04667”} 导入快捷界面 进口联合收割机 结构比特币价格:可解码、可识别{ var id=UUID() 让货币:字符串 出租率:字符串 } 结构BSVPrice:视图{ @State private var requests=Set() @国有私有var exchangeRate=[BitcoinPrice]() var body:一些观点{ 导航视图{ 列表(汇率){汇率单

下面是我正在尝试使用的代码,我只想显示当前价格和货币

该链接返回以下格式:
{“货币”:“美元”,“汇率”:“178.04667”}

导入快捷界面
进口联合收割机
结构比特币价格:可解码、可识别{
var id=UUID()
让货币:字符串
出租率:字符串
}
结构BSVPrice:视图{
@State private var requests=Set()
@国有私有var exchangeRate=[BitcoinPrice]()
var body:一些观点{
导航视图{
列表(汇率){汇率单位:
VStack(对齐:。前导){
文本(汇率、货币)
文本(速率。速率)
}
}
.navigationTitle(“比特币价格”)
}
奥纳佩尔先生{
让bitcoinPriceURL=URL(字符串:https://api.whatsonchain.com/v1/bsv/main/exchangerate")!
//让bitcoinPriceTask=fetch(bitcoinPriceURL,默认值:[BitcoinPrice]())
获取(bitcoinPriceURL,默认值:[BitcoinPrice]()){
汇率=$0
}
}
}
func fetch(url:url,defaultValue:T,completion:@escaping(T)->Void){
let decoder=JSONDecoder()
URLSession.shared.dataTaskPublisher(用于:url)
.重试(1)
.map(\.data)
.解码(类型:T.self,解码器:解码器)
.replaceError(带:defaultValue)
.receive(在:DispatchQueue.main上)
.sink(接收值:完成)
.store(在:&请求中)
}
func fetch(url:url,defaultValue:T)->AnyPublisher{
let decoder=JSONDecoder()
返回URLSession.shared.dataTaskPublisher(用于:url)
.重试(1)
.map(\.data)
.解码(类型:T.self,解码器:解码器)
.replaceError(带:defaultValue)
.receive(在:DispatchQueue.main上)
.删除任何发布者()
}
}
结构BSVPrice_预览:PreviewProvider{
静态var预览:一些视图{
BSVPrice()
}
}

有人知道为什么JSON没有加载到应用程序中吗?任何帮助都会很好,我已经获得了使用不同API的代码,所以有点混乱。

首先,您使用
.replaceError(with:defaultValue)
来抑制错误,它将隐藏所有错误并用默认值替换它们(此处为空列表)


它应该是
比特币价格
类型才能工作

请注意,来自链接的响应是单个对象,而不是数组

但是,在您的视图中,您将
[BitcoinPrice]
作为默认值传递:

fetch(bitcoinPriceURL, defaultValue: [BitcoinPrice]() ) { ...
由此推断
T
属于
[BitcoinPrice]
类型

同时从
BitcoinPrice
中删除
var id=UUID()

struct BitcoinPrice: Decodable {
    let currency: String
    let rate: String
}
然后像这样使用它:

List(exchangeRate, id: \.currency) { rate in

我还建议对集合使用复数名称,即
exchangeRates
而不是
exchangeRate

您应该以某种方式获取并打印解码错误。出现错误。感谢您的帮助!对于T.self,我试图使代码通用化,以便它可以处理任何东西,你是说我应该用BitcoinPrice替换T.self吗?我曾试图将您的建议融入到我的代码中,但它说我缺少一些参数。`@HenryHudson您的代码是通用的,没有问题。但是如果你想解码
比特币价格
,你需要让你的泛型函数正确推断
T
类型。你可以通过传递一些
BitcoinPrice
变量作为默认值来实现。我知道,我现在已经添加了BitcoinPrice()的默认值,但是我仍然收到一些错误,我认为主要的错误是它说我缺少@State private var exchangeRates=BitcoinPrice()中的一个参数,它需要一个from参数,在我试图将代码发布到该注释的大括号中,但受注释的字符数限制allow@HenryHudson
exchangeRate
是一个数组。分配解码值时:
exchangeRate=$0
将其替换为
exchangeRate=[$0]
fetch(bitcoinPriceURL, defaultValue: [BitcoinPrice]() ) { ...
struct BitcoinPrice: Decodable {
    let currency: String
    let rate: String
}
List(exchangeRate, id: \.currency) { rate in