🗂

Swift基礎文法:Typealias(タイプエイリアス)

2023/05/23に公開

Typealias

Swiftで基本的に提供する(既に存在する)データタイプでも人が任意で作ったデータタイプでも別の名前を与えることができる。これにより、より完結・可読性の高くコードが書けるので、知っておきたい。

Swift, SwiftUIでは3つの形に分けて使用する:

  • 既存タイプ:String, Int, Float, Double, Bool…
  • 使用者による定義タイプ:class, struct, enum…
  • 複合タイプ:closures
typealias MyCar = String
typealias YourCar = String
typealias Age = Int

let myCar: MyCar = "whiteCar"     // MyCar は String の別名
let yourCar: YourCar = "blueCar"
let myCarYear: Age = 2020

myCar = yourCar     // myCar と yourCar は String のため同じタイプの扱い

SwiftUI

アプリにある既存のModel及びデータタイプに適用できる。
今回は簡単にSwiftUIでの使い方について見てみよう。

新しいSwiftUIファイルを作ってやってみよう。
Modelを作ってBodyにこのモデルをコールする。

import SwiftUI

struct CarModel: Identifiable {
    var id = UUID().uuidString
    let ImageName: String
    let name: String
    let price: Int
    let isFavorite: Bool
}

let Cars = [
    CarModel(ImageName: "myCar", name: "俺の車", price: 500, isFavorite: true),
    CarModel(ImageName: "yourCar", name: "君の車", price: 1500, isFavorite: false)
]

//MARK: - Body
struct TypealiasView: View {
    
    var body: some View {
        HStack {
            carsRow(item: Cars[0])
            carsRow(item: Cars[1])
        }
    }
}

struct carsRow: View {
    var item: CarModel
    
    var body: some View {
        VStack(spacing: 20) {
            Image(item.ImageName)
                .resizable()
                .scaledToFill()
                .clipShape(Circle())
                .frame(width: 150, height: 150)
            Text(item.name)
                .font(.title)
                .fontWeight(.bold)
                .foregroundColor(.accentColor)
            Text("JPY \(item.price)")
                .font(Font.title2.weight(.semibold))
            
            if item.isFavorite {
                Image(systemName: "star.fill")
                    .foregroundColor(.yellow)
                    .imageScale(.large)
            } else {
                Image(systemName: "star")
                    .foregroundColor(.gray)
                    .imageScale(.large)
            }
        }
    }
}

このようにCarModelを作り、一つのViewを作ってみた。

ここで、このCarModel型のままでMotorcycleModelを追加したとすれば、
このようにコードが書ける。

import SwiftUI

//MARK: - Model
struct CarModel: Identifiable {
    var id = UUID().uuidString
    let ImageName: String
    let name: String
    let price: Int
    let isFavorite: Bool
}
let Cars = [
    CarModel(ImageName: "myCar", name: "俺の車", price: 500, isFavorite: true),
    CarModel(ImageName: "yourCar", name: "君の車", price: 1500, isFavorite: false)
]

struct MotorcycleModel: Identifiable {
    var id = UUID().uuidString
    let ImageName: String
    let name: String
    let price: Int
    let isFavorite: Bool
}
let Motorcycles = [
    MotorcycleModel(ImageName: "myMotorcycle", name: "俺のバイク", price: 300, isFavorite: true),
    MotorcycleModel(ImageName: "yourMotorcycle", name: "君のバイク", price: 200, isFavorite: false)
]

//MARK: - Body
...

そして、さらに複数のModelを追加することになれば、
長々しい分かりにくいコード化する。

この例ではCarsModelMotorcycleModel構造が同じのため、
以下のようにtypealiasが活用できる。

typealias MotorcycleModel = CarModel

そして、MotorcycleModelは消す。

import SwiftUI

//MARK: - Model
struct CarModel: Identifiable {
    var id = UUID().uuidString
    let ImageName: String
    let name: String
    let price: Int
    let isFavorite: Bool
}
let Cars = [
    CarModel(ImageName: "myCar", name: "俺の車", price: 500, isFavorite: true),
    CarModel(ImageName: "yourCar", name: "君の車", price: 1500, isFavorite: false)
]
let Motorcycles = [
    MotorcycleModel(ImageName: "myMotorcycle", name: "俺のバイク", price: 300, isFavorite: true),
    MotorcycleModel(ImageName: "yourMotorcycle", name: "君のバイク", price: 200, isFavorite: false)
]

typealias MotorcycleModel = CarModel

このように同じ型が多数出現する場面でtypealiasは有効に活用できる。

Discussion