1
0

Data.swift 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. See LICENSE folder for this sample’s licensing information.
  3. Abstract:
  4. Helpers for loading images and data.
  5. */
  6. import UIKit
  7. import SwiftUI
  8. import CoreLocation
  9. let landmarkData: [Landmark] = load("landmarkData.json")
  10. func load<T: Decodable>(_ filename: String) -> T {
  11. let data: Data
  12. guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
  13. else {
  14. fatalError("Couldn't find \(filename) in main bundle.")
  15. }
  16. do {
  17. data = try Data(contentsOf: file)
  18. } catch {
  19. fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
  20. }
  21. do {
  22. let decoder = JSONDecoder()
  23. return try decoder.decode(T.self, from: data)
  24. } catch {
  25. fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
  26. }
  27. }
  28. final class ImageStore {
  29. typealias _ImageDictionary = [String: CGImage]
  30. fileprivate var images: _ImageDictionary = [:]
  31. fileprivate static var scale = 2
  32. static var shared = ImageStore()
  33. func image(name: String) -> Image {
  34. let index = _guaranteeImage(name: name)
  35. return Image(images.values[index], scale: CGFloat(ImageStore.scale), label: Text(name))
  36. }
  37. static func loadImage(name: String) -> CGImage {
  38. guard
  39. let url = Bundle.main.url(forResource: name, withExtension: "jpg"),
  40. let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil),
  41. let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)
  42. else {
  43. fatalError("Couldn't load image \(name).jpg from main bundle.")
  44. }
  45. return image
  46. }
  47. fileprivate func _guaranteeImage(name: String) -> _ImageDictionary.Index {
  48. if let index = images.index(forKey: name) { return index }
  49. images[name] = ImageStore.loadImage(name: name)
  50. return images.index(forKey: name)!
  51. }
  52. }