В настоящее время я пытаюсь перейти от веб-разработчика только к мобильному и веб-разработчику, и у меня были большие трудности с быстрым обучением, я думаю, что я что-то изучаю и пишу это только для того, чтобы иметь множество ошибок. Прямо сейчас у меня есть следующий код для получения изображения с моего сервера внутри foreach l oop.
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 скрипт fetcher и структуры, которые ниже
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()
}
}
Я уверен, потому что я веб-разработчик по профессии, я думаю об этом неправильно, но, как вы можете сказать из код, я пытаюсь получить изображение внутри foreach, используя быстрый метод получения изображений с сервера, и пытаюсь отобразить его. Код, который я написал, имеет ошибку «Тип выражения неоднозначен без дополнительного контекста». Эта ошибка находится на линии внутри фактического представления, где я пытаюсь вызвать функцию; «Изображение (self.getPi c (urlLink: result.acPi c))» Я выделил фактические слова, выделенные ошибкой.
Конечно, ACPi c переменная является фактической переменной, которая не является обязательной, структуры. Я видел много других сообщений в StackOverflow об этой ошибке, но, как и в случае с несколькими ошибками swift, кажется, что одно и то же сообщение об ошибке может быть вызвано несколькими разными типами кода с разными целями и в сочетании с моим отсутствием swift По опыту, мне трудно понять связь между тем, что они сделали неправильно, и тем, что я сделал неправильно.
Однако, прочитав, я понял, что должен использовать что-то под названием Kingfisher для кэширования изображений, поскольку их сотни. Как установить эти репозитории git в мой проект? Просто дополнительный вопрос, нет необходимости действительно отвечать, вероятно, есть сотни видео.
Любая помощь будет оценена.