如何在SwiftUI中显示API数据

如何在SwiftUI中显示API数据,swift,swiftui,jsondecoder,Swift,Swiftui,Jsondecoder,我正在为自己制作一个应用程序,其中显示了一个subreddit的评论源,我正在尝试显示用户的天赋。有两种方法可以显示Reddit的用户天赋,一个是使用author\u flair\u text属性,该属性返回一个字符串,其中表情符号由其名称表示,例如这是我的flair:emoji:,另一个是使用author\u flair\u richtext属性,返回如下值: "author_flair_richtext": [ { &q

我正在为自己制作一个应用程序,其中显示了一个subreddit的评论源,我正在尝试显示用户的天赋。有两种方法可以显示Reddit的用户天赋,一个是使用
author\u flair\u text
属性,该属性返回一个字符串,其中表情符号由其名称表示,例如
这是我的flair:emoji:
,另一个是使用
author\u flair\u richtext
属性,返回如下值:

"author_flair_richtext": [
            {
              "a": ":emojiName:",
              "e": "emoji",
              "u": "link to the image for that emoji"
            },
            {
              "e": "text",
              "t": " Flair text"
            }
          ]
我在SwiftUI中完成了所有这些工作,以下是我迄今为止的代码:

struct FlairComponent: Decodable {
    var a: String?
    var e: String?
    var u: String?
    var t: String?
}

struct Comment: Decodable, Identifiable {
    //Other properties
    var author_flair_richtext: [FlairComponent?]
}

然后我想做一些类似的事情,但这不起作用,我也不完全确定为什么,因为我对这是一个新手,但我最好的猜测是,这不会因为有可选视图而影响不透明的返回类型

struct CommentFeedView: View {
    @State var comments = [Comment]()
    var body: some View {
        ForEach(comments) { comment in
            if let flairComponents = comment.author_flair_richtext {
                 ForEach(flairComponents) { flairComponent in
                      if let emojiURLString = flairComponent.u {
                           Image(UIImage: getEmojiUIImage(for: emojiURLString))
                      } else if let emojiText = flairComponent.t{
                           Text(emojiText)
                      }
                 }
            }
        }
    }
}

此外,对于如何实现getEmojiImage(for:)函数的任何提示,我们都非常感谢!祝你白天或晚上过得愉快,谢谢你读到这里:)

如果我理解正确,不同的类型会出现在
e
字段中,如果这是一个
表情符号,你需要得到它。是这样吗?
为此,最好创建一个单独的视图来实现这一点。让它成为一个
DisplayFlairView
,其中将有一个变量
richText
——是一个
FlairComponent
数组。现在,在正文中,我们将检查是否有富文本,如果有,我们将创建一个带有组件的HStack,检查它是文本还是表情符号。另外,对于获取图像,我建议使用URLImage—一个非常好的库,非常适合一次缓存多个图像。示例代码

struct DisplayFlairView: View {
    
    let richText: [FlairComponent]?
    
    var body: some View {
        if let flairText = richText {
            HStack(spacing: 4) {
                ForEach(flairText, id: \.self) { oneFlair in
                    if oneFlair.e == "emoji" {
                        URLImage(url: oneFlair.u!) { image in
                            image
                                .resizable()
                                .aspectRatio(contentMode: .fit)
                        }
                    } else if oneFlair.e == "text" {
                        Text(oneFlair.t!)
                    }
                }
            }
        }
    }
}
在你的评论中使用的是

struct CommentFeedView: View {
    @State var comments = [Comment]()
    var body: some View {
        ForEach(comments) { comment in
            if let flairComponents = comment.author_flair_richtext, !flairComponents.isEmpty {
                 DisplayFlairView(richText: flairComponents)
            }
        }
    }
}