🗂
Swift基礎文法:Typealias(タイプエイリアス)
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
を追加することになれば、
長々しい分かりにくいコード化する。
この例ではCarsModel
とMotorcycleModel
の構造が同じのため、
以下のように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