在 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 解码过程中没有看到错误)