Swiftでアプリ開発を始めたばかりの方は、「struct」という言葉を見かけて戸惑うことがあるかもしれません。この記事では、Swiftのstructについて、プログラミング初心者の方にもわかりやすく解説します。
目次
Swiftのstructとは?
structは「構造体(こうぞうたい)」の略で、関連するデータをひとまとめにして扱うための仕組みです。
例えば、人の情報を扱う場合、名前と年齢を別々の変数で管理するよりも、「Person」という1つのstructにまとめた方が便利です。
// バラバラに管理する場合
var personName = "太郎"
var personAge = 25
// structでまとめる場合
struct Person {
var name: String
var age: Int
}
structの基本的な書き方
structは以下のような構文で定義します。
struct 構造体名 {
var プロパティ名: 型
// 必要に応じてメソッドも定義できる
}
実際の例を見てみましょう。
struct Book {
var title: String
var author: String
var price: Int
func displayInfo() {
print("『\(title)』著者:\(author)、価格:\(price)円")
}
}
// 使用例
let myBook = Book(title: "Swiftプログラミング入門", author: "山田太郎", price: 3000)
myBook.displayInfo()
// 出力:『Swiftプログラミング入門』著者:山田太郎、価格:3000円
structの3つの特徴
1. 値型である
structは「値型」です。これは、変数に代入したりコピーしたりすると、データが複製されるという意味です。
struct Point {
var x: Int
var y: Int
}
var point1 = Point(x: 10, y: 20)
var point2 = point1 // コピーが作られる
point2.x = 50
print(point1.x) // 10(変更されていない)
print(point2.x) // 50
この例では、point2
を変更してもpoint1
には影響しません。これが値型の特徴です。
2. プロパティとメソッドを持てる
structには、データ(プロパティ)と、そのデータを操作する機能(メソッド)の両方を定義できます。
struct Rectangle {
var width: Double
var height: Double
// 面積を計算するメソッド
func area() -> Double {
return width * height
}
// 周囲の長さを計算するメソッド
func perimeter() -> Double {
return (width + height) * 2
}
}
let rect = Rectangle(width: 5.0, height: 3.0)
print("面積:\(rect.area())") // 面積:15.0
print("周囲:\(rect.perimeter())") // 周囲:16.0
3. 自動的にイニシャライザが生成される
structは、全てのプロパティを初期化するための「メンバーワイズイニシャライザ」が自動的に生成されます。
struct User {
var username: String
var email: String
}
// 自動的に生成されるイニシャライザを使用
let user = User(username: "swift_lover", email: "swift@example.com")
structとclassの違い
Swiftには、structと似た機能を持つ「class」もあります。初心者の方は、どちらを使うべきか迷うかもしれません。
特徴 | struct | class |
---|---|---|
型 | 値型(コピーされる) | 参照型(参照が渡される) |
継承 | できない | できる |
使い分け | シンプルなデータモデル | 複雑なオブジェクト、継承が必要な場合 |
どちらを使うべき?
Appleの公式ガイドラインでは、以下のような推奨があります。
- structを使う場合:シンプルなデータの集まり、等価性の比較が重要な場合
- classを使う場合:継承が必要、アイデンティティ(同一性)の管理が必要な場合
迷ったら、まずはstructから始めることをおすすめします。
実践的なstructの使用例
例1:商品情報の管理
struct Product {
var id: Int
var name: String
var price: Int
var inStock: Bool
func displayStatus() {
let status = inStock ? "在庫あり" : "在庫なし"
print("\(name)(¥\(price))- \(status)")
}
}
let product = Product(id: 1, name: "Swiftプログラミング本", price: 3500, inStock: true)
product.displayStatus()
// 出力:Swiftプログラミング本(¥3500)- 在庫あり
例2:座標の計算
struct Coordinate {
var latitude: Double
var longitude: Double
func distanceTo(_ other: Coordinate) -> String {
// 簡易的な距離計算の例
let latDiff = abs(latitude - other.latitude)
let lonDiff = abs(longitude - other.longitude)
return "緯度差:\(latDiff)、経度差:\(lonDiff)"
}
}
let tokyo = Coordinate(latitude: 35.6762, longitude: 139.6503)
let osaka = Coordinate(latitude: 34.6937, longitude: 135.5023)
print(tokyo.distanceTo(osaka))
structを使うメリット
- コードの可読性が向上する:関連するデータをまとめることで、コードが整理されます
- 安全性が高い:値型なので、予期しない変更から保護されます
- パフォーマンスが良い:多くの場合、classよりも高速に動作します
- スレッドセーフ:コピーが作られるため、マルチスレッド環境でも安全です
まとめ
Swiftのstructは、関連するデータをまとめて扱うための強力な機能です。以下のポイントを覚えておきましょう。
- structは値型で、コピーされる
- プロパティとメソッドを持てる
- 自動的にイニシャライザが生成される
- シンプルなデータモデルにはstructを使う
- 迷ったらまずstructから始める
structをマスターすることで、より読みやすく保守しやすいSwiftコードが書けるようになります。ぜひ実際のコードで試してみてください。