swift
1import UIKit 2import SwiftUI 3import CoreLocation 4 5let landmarkData: [Landmark] = load("landmarkData.json") 6 7func load<T: Decodable>(_ filename: String) -> T { 8 let data: Data 9 10 guard let file = Bundle.main.url(forResource: filename, withExtension: nil) 11 else { 12 fatalError("Couldn't find (filename) in main bundle.") 13 } 14 15 16 do { 17 data = try Data(contentsOf: file) 18 } catch { 19 fatalError("Couldn't load (filename) from main bundle:\n(error)") 20 } 21 22 do { 23 let decoder = JSONDecoder() 24 return try decoder.decode(T.self, from: data) 25 } catch { 26 fatalError("Couldn't parse (filename) as (T.self):\n(error)") 27 } 28} 29 30 31 32 33final class ImageStore { 34 typealias _ImageDictionary = [String: CGImage] 35 fileprivate var images: _ImageDictionary = [:] 36 37 fileprivate static var scale = 2 38 39 static var shared = ImageStore() 40 41 42 func image(name: String) -> Image { 43 let index = _guaranteeImage(name: name) 44 45 return Image(images.values[index], scale: CGFloat(ImageStore.scale), label: Text(name)) 46 } 47 48 49 50 51 static func loadImage(name: String) -> CGImage { 52 53 guard 54 let url = Bundle.main.url(forResource: name, withExtension: "jpg"), 55 let imageSource = CGImageSourceCreateWithURL(url as NSURL, nil), 56 let image = CGImageSourceCreateImageAtIndex(imageSource, 0, nil) 57 else { 58 fatalError("Couldn't load image (name).jpg from main bundle.") 59 } 60 61 return image 62 } 63 64 65 66 67 fileprivate func _guaranteeImage(name: String) -> _ImageDictionary.Index { 68 if let index = images.index(forKey: name) { return index } 69 images[name] = ImageStore.loadImage(name: name) 70 return images.index(forKey: name)! 71 } 72}
https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation
上記ページのダウンロードしたプロジェクトのData.swiftなんですが、
ストアドプロパティimagesはディクショナリで、その要素を識別・指定するためにindexを使っています。
ディクショナリ内の要素を識別するのはkeyでできるような気がします。
keyで識別できるのであればindexを使う必要はないと思うのですが、
indexを使っている理由がよくわかりません。
上記コードはindexを使わずに実装することは不可能なのでしょうか?
使わなくてもできるけど使っているのであれば、indexを使うなんらかのメリットがあると思うのですが、
それって何なのでしょうか?
毎回 key でアクセスするよりは index を使った方が速い可能性はありますが、key の追加や削除があると index がずれて事故の原因になるので、普通は key でアクセスする方がいいと思います。(Apple 内部ではレビュー体制が整っているので事故は起こさないし、それよりも速度が重要なのでしょう、きっと。)
回答1件
あなたの回答
tips
プレビュー