目前,我正在尝试解析单个对象,并将其解码,准备在我的SwiftUI视图中输出到Text()中,但我无法创建一个没有参数的实例。
我找到了很多动态创建列表的资源,但这只是一个独立的对象。很多资源都展示了如何使用数组创建一个@Published变量,但我只想要一个对象。
我所建立的解码结构是。
// MARK: - Welcome
struct Welcome: Codable {
let verse: Verse
}
// MARK: - Verse
struct Verse: Codable {
let details: Details
let notice: String
}
// MARK: - Details
struct Details: Codable {
let text, reference, version: String
let verseurl: String
}
我创建了以下的fetcher:
public class VerseFetcher: ObservableObject {
@Published var verse = Welcome()
init(){
load()
}
func load() {
let url = URL(string: "https://beta.ourmanna.com/api/v1/get/?format=json")!
URLSession.shared.dataTask(with: url) {(data,response,error) in
do {
if let d = data {
let webData = try JSONDecoder().decode(Verse.self, from: d)
DispatchQueue.main.async {
self.verse = webData
}
}else {
print("No Data")
}
} catch {
print ("Error here")
}
}.resume()
}
}
我试着用这个方法得到一个输出结果:
struct DailyVerseView: View {
@ObservedObject var fetcher = VerseFetcher()
var body: some View {
Text(self.fetchVerse.todos.verse.details.text)
.fontWeight(.semibold)
.font(.caption)
.foregroundColor(.secondary)
.padding(.leading, 16)
.padding(.trailing, 16)
.padding(.top, 8)
.padding(.bottom, 8)
}
}
我从URL中读到的JSON是: https:/beta.ourmanna.comapiv1get?format=json。 是。
{
"verse": {
"details": {
"text": "The world and its desires pass away, but the man who does the will of God lives forever.",
"reference": "1 John 2:17",
"version": "NIV",
"verseurl": "http://www.ourmanna.com/"
},
"notice": "Powered by OurManna.com"
}
}
我如何在没有参数的情况下创建Verse结构,因为它是动态的URL响应?
你的问题中提到的代码不能编译.为了使你的代码能够正常工作,我对你的代码进行了修改,也添加了一些注释。
struct DailyVerseView: View {
@ObservedObject var fetcher = VerseFetcher()
var body: some View {
Text(self.fetcher.verse?.verse.details.text ?? "") // Changed fetchVerse to fetcher
.fontWeight(.semibold)
.font(.caption)
.foregroundColor(.secondary)
.padding(.leading, 16)
.padding(.trailing, 16)
.padding(.top, 8)
.padding(.bottom, 8)
}}
public class VerseFetcher: ObservableObject {
@Published var verse: Welcome?
init(){
load()
}
func load() {
let url = URL(string: "https://beta.ourmanna.com/api/v1/get/?format=json")!
URLSession.shared.dataTask(with: url) {(data,response,error) in
do {
if let d = data {
//Decoding Welcome instead of Verse directly
let webData = try JSONDecoder().decode(Welcome.self, from: d)
DispatchQueue.main.async {
self.verse = webData
}
}else {
print("No Data")
}
} catch {
print ("Error here")
}
}.resume()
}}
// MARK: - Welcome
struct Welcome: Codable {
let verse: Verse
}
// MARK: - Verse
struct Verse: Codable {
let details: Details
let notice: String
}
// MARK: - Details
struct Details: Codable {
let text, reference, version: String
let verseurl: String
}