Swiftの学習において重要な「変数の有効範囲(スコープ)」、データの集合である「配列」、そしてプログラムの部品を作る「構造体」の基本をまとめました。
1. スコープ(Scope):変数が有効な範囲
変数や定数には、それらが使用できる範囲があります。基本的には { } (波括弧) の中 がその範囲となります。
ローカルスコープ
{ } の中で宣言された変数は、その中だけで有効です。これを**ローカル変数(または定数)**と呼びます。
// NG例
for i in 1...10 {
let num = 2 * i // numはfor文の中だけで有効な「ローカル定数」
print(num)
}
print(num) // エラー! スコープの外からはアクセスできません
グローバルスコープ
どのローカルスコープにも属さない、最も外側のスコープです。Swiftのプロジェクト内であれば、基本的にどこからでもアクセス可能です。
var sum = 0 // グローバルなスコープで宣言
for i in 1...10 {
sum = sum + i // 外側の変数にアクセスして書き換え可能
}
print(sum) // 55
2.配列(Array):複数のデータをまとめて扱う
同じ型のデータを一列に並べて管理する仕組みです。
基本ルール
箱の中にデータが並んでいるイメージです。
データの位置を示す番号を**添え字(インデックス)**と呼び、0から始まります。
書き方
リテラル: [値, 値, 値, ...]
型指定: Array<型> または [型]
// 型推論を利用
var a = [0, 2, 4, 6, 8]
// 明示的な型指定
var b: [Int] = [1, 1, 2, 3, 5]
// 要素へのアクセス(配列名[インデックス])
print(a[0]) // 0
// 配列の結合(+ 演算子)
let combined = a + b
3. 構造体(Struct):データと機能をまとめる
構造体は、関連する「データ(変数・定数)」と「振る舞い(関数)」を一つにまとめる仕組みです。用語,説明
プロパティ,構造体の中で定義された変数や定数
メソッド,構造体の中で定義された関数
イニシャライザ,インスタンス化(実体化)の際に、プロパティを初期化する特別な関数
struct Box {
var width: Float
var length: Float
var height: Float
// イニシャライザ(selfは構造体自身を指す)
init(w: Float, l: Float, h: Float) {
self.width = w
self.length = l
self.height = h
}
}
Tips: メンバーワイズイニシャライザ
Swiftの構造体では、プロパティを宣言すれば init を自分で書かなくても、自動的に初期化用の関数が生成されます。
- 実践的な構造体の例(Student)
「学生」という単位で、名前・年齢・点数・平均計算をまとめた例です。
struct Student {
var name: String
var age: Int
var points: [Int] // [国語, 数学, 英語]
// メソッド:平均点を計算する
func ave() -> Float {
var sum = 0
for point in points {
sum += point
}
// Swiftでは計算する値の型を揃える必要があるため、Float型にキャストする
return Float(sum) / Float(points.count)
}
// メソッド:情報を出力する
func printInfo() {
let average = self.ave() // 構造体内の他のメソッドを呼び出す
print("氏名は\(name)です。")
print("試験の平均点は\(average)です。")
}
}
// インスタンス化(実体化)
var s = Student(name: "田中", age: 15, points: [70, 79, 85])
// メソッドの実行(ドット記法)
s.printInfo()
インスタンス化とは
設計図(構造体)から、具体的なデータを持った「実体(インスタンス)」を作ることです。
インスタンス名.プロパティ名 のように、ドット(.)を使うことで、その実体が持つ情報や機能にアクセスできます。
※ドットは日本語で考えると『〜の』の役目になるらしいです。
まとめ
今回は基礎でありながらも初心者にとっては理解に時間がかかりそうな内容をまとめました。
私もまだまだコードをスラスラ書いたり、読めたりするわけではないのですが、少しずつ慣れていこうと考えています。
・スコープ:変数が使える「範囲」を意識する。
・配列:複数のデータをインデックス(0番〜)で管理する。
・構造体:データ(プロパティ)と処理(メソッド)をセットにして整理する。