Swift не может получить изображения с URL в списке forEach - PullRequest
0 голосов
/ 28 марта 2020

В настоящее время я пытаюсь перейти от веб-разработчика только к мобильному и веб-разработчику, и у меня были большие трудности с быстрым обучением, я думаю, что я что-то изучаю и пишу это только для того, чтобы иметь множество ошибок. Прямо сейчас у меня есть следующий код для получения изображения с моего сервера внутри 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 в мой проект? Просто дополнительный вопрос, нет необходимости действительно отвечать, вероятно, есть сотни видео.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 марта 2020

Обновление

Image(self.getPic(urlLink: result.acPic)) 

до

self.getPic(urlLink: result.acPic)

Изображение не имеет метода init, который получает необязательный объект Image и возвращает объект Image

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...