LoginSignup
8
6

More than 3 years have passed since last update.

SwiftUI Tutorilasを読み解く パート2

Last updated at Posted at 2019-09-04

この記事は何?

前回の続きです。
今回は、Landmark.swiftファイルを読み解きたいと思います。

Landmark.swift

主に、観光地を表現する構造体を記述しているファイルです。
プロジェクトのModelグループにあります。

ソースコード

最初にコード全体を見ておきます。
SwiftUIのチュートリアルではありますが、やはりSwiftUIの概念は無きに等しいと言えます。
全体としては、次の4つに分けて読むことができます。

  • フレームワークのインポート
  • Landmark 型の定義
  • Landmark 型の拡張
  • Coordinates 型の定義
Landmark.swift
import SwiftUI
import CoreLocation

struct Landmark: Hashable, Codable {
    var id: Int
    var name: String
    fileprivate var imageName: String
    fileprivate var coordinates: Coordinates
    var state: String
    var park: String
    var category: Category

    var locationCoordinate: CLLocationCoordinate2D {
        CLLocationCoordinate2D(
            latitude: coordinates.latitude,
            longitude: coordinates.longitude)
    }

    enum Category: String, CaseIterable, Codable, Hashable {
        case featured = "Featured"
        case lakes = "Lakes"
        case rivers = "Rivers"
    }
}

extension Landmark {
    var image: Image {
        ImageStore.shared.image(name: imageName)
    }
}

struct Coordinates: Hashable, Codable {
    var latitude: Double
    var longitude: Double
}

フレームワークのインポート

SwiftUI フレームワークは、Image ビューを扱うためにインポートされています。
CoreLocation は座標系を扱うためにインポートされています。

Landmark.swift
import SwiftUI
import CoreLocation

Coordinates 構造体

緯度を扱う変数 latitude と経度を扱う変数 longitude が宣言されいるだけです。
共に、座標系のデータ型ではなく、シンプルな Double 型になっています。

Landmark.swift
struct Coordinates: Hashable, Codable {
    var latitude: Double
    var longitude: Double
}

構造体が、2つのプロトコル Hashable, Codable に準拠している点に注意です。

Landmark 構造体

このファイルの本体となっている部分で、1つの観光地を表現する型です。
やはり、HashableCodable に準拠しています。

Landmark.swift
struct Landmark: Hashable, Codable {
    var id: Int
    var name: String
    fileprivate var imageName: String
    fileprivate var coordinates: Coordinates
    var state: String
    var park: String
    var category: Category

    var locationCoordinate: CLLocationCoordinate2D {
        CLLocationCoordinate2D(
            latitude: coordinates.latitude,
            longitude: coordinates.longitude)
    }

    enum Category: String, CaseIterable, Codable, Hashable {
        case featured = "Featured"
        case lakes = "Lakes"
        case rivers = "Rivers"
    }
}

プロパティ

Landmark構造体のメンバープロパティ
var id: Int
var name: String
fileprivate var imageName: String
fileprivate var coordinates: Coordinates
var state: String
var park: String
var category: Category
var locationCoordinate: CLLocationCoordinate2D {
    CLLocationCoordinate2D( latitude: coordinates.latitude,
                            longitude: coordinates.longitude)
}

プロパティとして、8つの変数(うち、1つは計算プロパティ)が宣言されています。
注目すべきプロパティは、imageName です。
この文字列を基に、画像データを取得することになります。
また、観光地を区分するための列挙型 Category も定義されています。

この時点で不思議なのは、coordinateslocationCoordinate の違いです。
どちらも座標系を表現していますが、coordinates はカスタム構造体で locationCoordinateCLLocationCoordinate2D型 を返す計算プロパティになっています。
チュートリアルを進めていけば、それぞれの役割が理解できると思われます。

Landmark エクステンション

観光地の画像データが割り当てられる変数 image があります。
計算プロパティになっており、アクセスがあるたびに画像を返します。
シングルトンパターンによって、 ImageStore インスタンスの型プロパティ shared から image(name:) メソッドを呼び出しています。

Landmark.swift
extension Landmark {
    var image: Image {
        ImageStore.shared.image(name: imageName)
    }
}
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6