在 SwiftUI 中解码 Wordpress API 值时出现 StringProtocol 问题
StringProtocol issue when decoding Wordpress API value in SwiftUI
我遇到了与此处所述完全相同的问题:
Wordpress REST API + Swift
但是接受的答案对我不起作用。
我检索 Wordpress 帖子的代码 API:
import SwiftUI
struct Rendered: Codable {
var rendered: String
}
struct Post: Codable, Identifiable {
var id: Int
var title: Rendered
}
class Api {
func getPosts(completion: @escaping ([Post]) -> ()) {
guard let url = URL(string: "https://9fc9d65.ngrok.io/wp-json/wp/v2/posts") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
let posts = try! JSONDecoder().decode([Post].self, from: data!)
DispatchQueue.main.async {
completion(posts)
}
}
.resume() //resume session call
}
}
示例 JSON 响应:
[
{
"id": 7,
"title": {
"rendered": "Example Title"
}
}
]
我将 API 结果呈现为列表:
import SwiftUI
struct PostList: View {
@State var posts: [Post] = []
var body: some View {
List(posts) { post in
Text(post.title)
}
.onAppear {
Api().getPosts { (posts) in
self.posts = posts
}
}
}
}
struct PostList_Previews: PreviewProvider {
static var previews: some View {
PostList()
}
}
List()
中的这一行是我尝试访问解码标题的地方,也是我收到错误的地方:
Text(post.title)
我得到的错误:
Initializer 'init(_:)' requires that 'Rendered' conform to 'StringProtocol'
你的模型是这样定义的:
struct Rendered: Codable {
var rendered: String
}
struct Post: Codable, Identifiable {
var id: Int
var title: Rendered
}
这意味着 title
属于 Rendered
类型,它本身不是 String
,而是一个带有名为 rendered
的子协议的结构。
因此,我怀疑您只需要更改线路即可:
Text(post.title)
至:
Text(post.title.rendered)
(假设您在 JSON 解码过程中没有看到错误)
我遇到了与此处所述完全相同的问题: Wordpress REST API + Swift
但是接受的答案对我不起作用。
我检索 Wordpress 帖子的代码 API:
import SwiftUI
struct Rendered: Codable {
var rendered: String
}
struct Post: Codable, Identifiable {
var id: Int
var title: Rendered
}
class Api {
func getPosts(completion: @escaping ([Post]) -> ()) {
guard let url = URL(string: "https://9fc9d65.ngrok.io/wp-json/wp/v2/posts") else { return }
URLSession.shared.dataTask(with: url) { (data, _, _) in
let posts = try! JSONDecoder().decode([Post].self, from: data!)
DispatchQueue.main.async {
completion(posts)
}
}
.resume() //resume session call
}
}
示例 JSON 响应:
[
{
"id": 7,
"title": {
"rendered": "Example Title"
}
}
]
我将 API 结果呈现为列表:
import SwiftUI
struct PostList: View {
@State var posts: [Post] = []
var body: some View {
List(posts) { post in
Text(post.title)
}
.onAppear {
Api().getPosts { (posts) in
self.posts = posts
}
}
}
}
struct PostList_Previews: PreviewProvider {
static var previews: some View {
PostList()
}
}
List()
中的这一行是我尝试访问解码标题的地方,也是我收到错误的地方:
Text(post.title)
我得到的错误:
Initializer 'init(_:)' requires that 'Rendered' conform to 'StringProtocol'
你的模型是这样定义的:
struct Rendered: Codable {
var rendered: String
}
struct Post: Codable, Identifiable {
var id: Int
var title: Rendered
}
这意味着 title
属于 Rendered
类型,它本身不是 String
,而是一个带有名为 rendered
的子协议的结构。
因此,我怀疑您只需要更改线路即可:
Text(post.title)
至:
Text(post.title.rendered)
(假设您在 JSON 解码过程中没有看到错误)