Не удается найти ‘LocationsData’ в области видимости

#json #parsing #swiftui

#json #синтаксический анализ #swiftui

Вопрос:

Мой проект содержит файл JSON ‘LocationsData.json’

Отображается сообщение об ошибке ‘Не удается найти ‘LocationsData’ в области видимости’

(При необходимости — следующий код содержится в моем файле ‘Data.swift’, на который ссылается переменная ‘locationsDataTypes’ в ‘SearchRedirect.swift’)

 import UIKit
import SwiftUI
import CoreLocation

let locationsDataTypes: [LocationsDataTypes] = load("LocationsData.json")

func load<T: Decodable>(_ filename: String) -> T {
let data: Data

guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
        fatalError("Couldn't find (filename) in main bundle.")
}

do {
    data = try Data(contentsOf: file)
} catch {
    fatalError("Couldn't load (filename) from main bundle:n(error)")
}

do {
    let decoder = JSONDecoder()
    return try decoder.decode(T.self, from: data)
} catch {
    fatalError("Couldn't parse (filename) as (T.self):n(error)")
}
}

final class ImageStore {
typealias _ImageDictionary = [String: CGImage]
fileprivate var images: _ImageDictionary = [:]

fileprivate static var scale = 2

static var shared = ImageStore()

func image(name: String) -> Image {
    let index = _guaranteeImage(name: name)
    
    return Image(images.values[index], scale: CGFloat(ImageStore.scale), label: Text(name))
}

static func loadImage(name: String) -> CGImage {
    guard
        let url = Bundle.main.url(forResource: name, withExtension: "jpg"),
        let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),
        let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)
    else {
        fatalError("Couldn't load image (name).jpg from main bundle.")
    }
    return image
}

fileprivate func _guaranteeImage(name: String) -> _ImageDictionary.Index {
    if let index = images.index(forKey: name) { return index }
    
    images[name] = ImageStore.loadImage(name: name)
    return images.index(forKey: name)!
}
} 
  

Комментарии:

1. LocationsData нигде не объявлено. Вы имели в виду locationsDataTypes ?

Ответ №1:

Как намекнул pawello2222, locationsData нигде не объявлено.

Я подозреваю, что ваша List функция view builder написана неправильно.

Вместо этого…

 List(LocationsData, id: .id) { locationsDataTypes in
  

Попробуйте следующее…

 List(locationsDataTypes, id: .id) { locationsData in
    ...
                Image(locationsData.imageName)
                    .resizable
    ...
}
  

Где locationsDataTypes находится коллекция, в вашем случае массив LocationsDataTypes и locationsData является единственным экземпляром каждой итерации через эту коллекцию.

Кроме того, при написании вопроса в stack overflow рекомендуется включать соответствующий код в блок кода в вашем вопросе, доступ к которому не осуществляется по гиперссылке. Для этого есть много причин, вот пара…

  • сообществу SO проще скопировать и вставить ваш код в их решение как часть их ответа, экономя нам всем много времени;
  • ссылки прерываются, оставляя ваш вопрос без контекста для всех, у кого может возникнуть такая же проблема в будущем.