【发布时间】:2020-07-09 04:13:50
【问题描述】:
我目前正在尝试从仅 Web 开发人员过渡到移动和 Web 开发人员,并且在学习 swift 时遇到了很大的困难,我想我学到了一些东西并编写它只是有很多错误。现在我有以下代码可以在 foreach 循环中从我的服务器获取图像。
struct MainNotLoggedInView: View {
@ObservedObject var fetcher = Fetcher()
func getPic(urlLink: String) -> Image? {
let baseURL = "https://mywebsite.com"
let url = URL(string: baseURL + urlLink)
let data = try? Data(contentsOf: url!)
let image = UIImage(data: data!)
let image2 = Image(uiImage: (image ?? nil)!)
return image2
}
var body: some View{
VStack{
TabView {
ScrollView {
ZStack {
if fetcher.hasFinished == true {
VStack {
Text("Featured").font(.largeTitle).padding()
ForEach(fetcher.ac?.ac.featuredAc ?? []) { result in
VStack {
Text(result.name)
Image(self.getPic(urlLink: result.acPic))
}
}
}
} else {
Text("Featured").font(.largeTitle).padding()
}
}
}.tabItem {
Text("Featured").font(.subheadline)
}
OtherView().tabItem {
Text("Other").font(.subheadline)
}
}
}
}
}
我假设为了弄清楚发生了什么,我还应该包括 JSON 提取器脚本和结构,如下所示
import SwiftUI
import Combine
import Foundation
public struct AcModel: Codable, Identifiable {
public let id: Int
public let name: String
public let acPic: String
enum CodingKeys: String, CodingKey {
case id = "id"
case name = "name"
case acPic = "picture_link"
}
}
public struct AcModel2: Codable {
public let location: String
private var popular: [String:AcModel]
public var popularAc: [AcModel] {
get {
return Array(self.popular.values)
}
}
private var featured: [String:AcModel]
public var featuredAc: [AcModel] {
get {
return Array(self.featured.values)
}
}
}
public struct AcModel: Codable {
public let ac: AcModel2
}
public class Fetcher: ObservableObject {
public let objectWillChange = PassthroughSubject<Fetcher,Never>()
@Published var hasFinished: Bool = false {
didSet {
objectWillChange.send(self)
}
}
var ac: AcModel?
init(){
guard let url = URL(string: "https://mywebsite.com/api/loadactivitiesguest") else { return }
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "POST"
URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
do {
if let d = data {
let decodedLists = try JSONDecoder().decode(AcModel.self, from: d)
DispatchQueue.main.async {
self.ac = decodedLists
self.hasFinished = true
print("dispatching")
}
} else {
print("No Data")
}
} catch {
print("Error")
}
}.resume()
}
}
我敢肯定,因为我是一名网络开发人员,所以我的想法是错误的,但正如您从代码中看出的那样,我正在尝试使用 swift 方法在 foreach 中获取图片从服务器检索图片,并尝试显示它。我编写的代码有错误“表达式类型不明确,没有更多上下文”。此错误位于我尝试调用该函数的实际视图内的行上; “图像(self.getPic(urlLink:result.acPic))” 我将错误突出显示的实际单词加粗。
当然,acPic 变量是结构的一个实际变量,它不是可选的。我已经看过很多关于这个错误的其他 StackOverflow 帖子,但是与几个 swift 错误一样,似乎相同的错误消息可能是由具有不同目的的几种不同类型的代码引起的,并且结合我缺乏 swift经验,我很难理解他们做错了什么和我做错了什么之间的关系。
但是,通过阅读,我了解到我应该使用名为 Kingfisher 的东西来缓存图像,因为有数百个图像。如何将这些 git 存储库安装到我的项目中?只是一个附带问题,无需真正回答,可能有数百个视频。
任何帮助将不胜感激。
【问题讨论】: