📚 Swift入門シリーズ: #4 コメントと文法 → #5 変数と定数
プログラミングでは、扱うデータの「種類」を理解することが重要です。この記事では、Swiftの基本的なデータ型である文字列(String)と整数(Int)について学びましょう。
来春からデータサイエンティストとして働く予定の技術オタク。
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
前回は変数varと定数letの使い分けを学んだね!
そうだね。今回は、変数や定数に入れるデータの「型」について詳しく学んでいくよ。
変数と定数の違いがわかったよ!letとvarを使い分けられるようになった!
いいね。今回は、変数や定数に入れるデータの「型」について詳しく学んでいくよ。
前回「型」っていう言葉が出てきたけど、型って何?
いい質問だね。型(type) っていうのは、データの種類や性質を表すものなんだ。例えば、「文字列」「整数」「小数」「真偽値」みたいに、データには色々な種類があるんだよ。
型があることで、Swiftは「これは文字として扱う」「これは数字として計算する」って判断できるんだ。型が違うと、できる操作も違うんだよ。例えば、文字列同士は連結できるけど、文字列と数字を直接足し算することはできないんだ。
へー、データには種類があるんだ。どんな型があるの?
Swiftには色々な型があるんだけど、今日は最もよく使う2つの型、String(文字列型) と Int(整数型) を学んでいこう。
String(文字列型)
String は、テキスト(文字列)を扱うための型なんだ。これまで "Hello" とか "太郎" みたいにダブルクォーテーションで囲んでいたものが、すべてString型なんだよ。
let message: String = "こんにちは"
let name: String = "太郎"
: String の部分が 型注釈(type annotation) で、「この変数はString型ですよ」って明示しているんだ。ただし、実はこれを省略しても大丈夫なんだよ。
let message = "こんにちは" // 自動的にString型だと推論される
Swiftは 型推論(type inference) という機能を持っていて、値から自動的に型を判断してくれるんだ。ダブルクォーテーションで囲まれていれば「これはStringだな」ってわかるからね。
型を書かなくても自動で判断してくれるんだ!便利!
文字列の連結
String同士は、+ 演算子で連結できるんだ。
let firstName = "太郎"
let lastName = "山田"
let fullName = firstName + lastName
print(fullName) // 太郎山田
ただ、これだと間にスペースがないから、こう書くこともできるよ。
let fullName = lastName + " " + firstName
print(fullName) // 山田 太郎
" " は空白1文字の文字列なんだ。
文字列補間(String Interpolation)
文字列の中に変数や式の値を埋め込む、もっと便利な方法があるんだ。文字列補間(String Interpolation) っていうんだよ。
let name = "太郎"
let age = 20
let message = "私の名前は\(name)で、年齢は\(age)歳です"
print(message) // 私の名前は太郎で、年齢は20歳です
\(変数名) という書き方で、文字列の中に変数の値を埋め込めるんだ。これを使えば、文字列の連結よりも読みやすく書けるんだよ。
おお!これは便利!()で囲めばいいんだね!
そうそう。しかも、\() の中には変数だけじゃなくて、式も書けるんだ。
let price = 1000
let quantity = 3
let message = "合計金額は\(price * quantity)円です"
print(message) // 合計金額は3000円です
\(price * quantity) で、計算結果が文字列に埋め込まれるんだよ。
文字列のプロパティとメソッド
String型には、便利な プロパティ や メソッド がたくさんあるんだ。
プロパティっていうのは、その値が持っている情報や特性のことで、メソッドっていうのは、その値に対して実行できる処理のことなんだよ。
例えば、文字列の長さ(文字数)を調べる count プロパティ。
let text = "Hello"
print(text.count) // 5
ドット . で繋げて text.count と書くことで、文字列の長さを取得できるんだ。
次に、文字列が空かどうかを調べる isEmpty プロパティ。
let emptyText = ""
print(emptyText.isEmpty) // true
let text = "Hello"
print(text.isEmpty) // false
isEmpty は、文字列が空の場合に true、何か文字が入っている場合に false を返すんだよ。
true とか false って何?
それは次の次の記事で学ぶ「真偽値(Bool型)」なんだ。今は「true は『はい』、false は『いいえ』みたいな意味」って思っておいてもらえれば大丈夫だよ。
よく使う文字列メソッド
他にもよく使うメソッドを紹介するね。
大文字・小文字の変換
let text = "Hello"
print(text.uppercased()) // HELLO
print(text.lowercased()) // hello
uppercased() で全て大文字に、lowercased() で全て小文字に変換できるんだ。メソッドは、名前の後に括弧 () をつけて呼び出すんだよ。
前後の空白を削除
let text = " Hello "
print(text.trimmingCharacters(in: .whitespaces)) // Hello
文字列の前後にある空白を削除できるんだ。これはユーザーの入力を処理するときによく使うよ。
特定の文字列を含むか確認
let text = "Hello, World!"
print(text.contains("World")) // true
print(text.contains("Swift")) // false
contains() メソッドで、特定の文字列が含まれているか確認できるんだ。
いろんなことができるんだね!便利!
Int(整数型)
次は整数型?それって普通の数字のこと?
そうだよ。Int は整数(整数=小数点のない数)を扱うための型なんだ。「Integer(整数)」の略なんだよ。
let age: Int = 20
let score: Int = 100
これも型推論が効くから、型注釈を省略できるんだ。
let age = 20 // 自動的にInt型だと推論される
整数の計算
Int型の値は、算術演算子を使って計算できるんだ。
let a = 10
let b = 3
print(a + b) // 13(加算)
print(a - b) // 7(減算)
print(a * b) // 30(乗算)
print(a / b) // 3(除算)
print(a % b) // 1(剰余)
ここで注意が必要なのは、整数の除算は小数を切り捨てる ってことなんだ。10 / 3 は本当は 3.333... だけど、Int同士の計算では 3 になるんだよ。
それと、% は 剰余演算子(modulo) って呼ばれていて、割り算の余りを計算するんだ。10 % 3 は「10を3で割った余り」だから 1 になるんだよ。
10割る3が3になっちゃうの!?小数はどこいったの?
Int型は整数しか扱えないから、小数部分は切り捨てられちゃうんだ。小数を扱いたい場合は、次の記事で学ぶ「Double型」を使う必要があるんだよ。
型が違うと、同じ演算でも結果が変わることがあるんだ。これが型を理解することの重要性なんだよ。
整数の範囲
Intには扱える数値の範囲があるんだ。現代のコンピュータでは、Intは通常64ビットで、約 -9京 から +9京 までの数を扱えるんだよ。
print(Int.min) // -9223372036854775808
print(Int.max) // 9223372036854775807
Int.min と Int.max で、Intの最小値と最大値を確認できるんだ。普通のプログラムでは、この範囲で十分なことがほとんどだよ。
9京!?そんなに大きい数まで扱えるの!?
そうなんだ。でも、もし範囲を超えた計算をしようとすると、オーバーフロー っていう問題が起きることがあるんだ。Swiftはオーバーフローを検出してクラッシュするようになっているから、安全性が高いんだよ。
整数の便利な機能
Int型にも便利なプロパティやメソッドがあるんだ。
絶対値を取得
let number = -10
print(abs(number)) // 10
abs() 関数で、数値の絶対値を取得できるんだ。
最大値・最小値を求める
let a = 10
let b = 20
print(max(a, b)) // 20
print(min(a, b)) // 10
max() と min() で、複数の値から最大値・最小値を求められるんだよ。
累乗を計算
let result = pow(2.0, 3.0) // 2の3乗
print(result) // 8.0
pow() 関数で累乗を計算できるんだけど、これは引数と戻り値がDoubleなんだ。Doubleについては次の記事で学ぶよ。
型の変換
StringとIntって、お互いに変換できないの?例えば、"123"っていう文字列を数字の123にしたいときとか。
素晴らしい質問だね。実は、型の変換はとても重要な操作なんだ。
IntからStringへの変換
let age = 20
let ageString = String(age)
print(ageString) // "20"(文字列)
String() に Int を渡すことで、整数を文字列に変換できるんだ。
StringからIntへの変換
let numberString = "123"
let number = Int(numberString)
print(number) // Optional(123)
Int() に String を渡すことで、文字列を整数に変換できる...んだけど、ちょっと複雑なんだ。Optional(123) って表示されているよね。これは オプショナル型 っていう特別な型で、「値があるかもしれないし、ないかもしれない」っていう状態を表しているんだよ。
Optional?値があるかもしれないし、ないかもしれない?どういうこと?
例えば、"abc" っていう文字列を数字に変換しようとしたらどうなると思う?
let invalidString = "abc"
let number = Int(invalidString)
print(number) // nil
"abc" は数字じゃないから、変換できないよね。この場合、nil っていう「値がない」ことを表す特殊な値になるんだ。
Swiftは、変換が失敗する可能性がある操作には、オプショナル型を使って「失敗するかもしれませんよ」って教えてくれるんだよ。オプショナル型については、第6章で詳しく学ぶから、今は「変換が失敗することもあるんだな」って覚えておいてもらえれば大丈夫だよ。
文字列補間での自動変換
ちなみに、文字列補間 \() の中では、自動的にStringに変換されるんだ。
let age = 20
let message = "私は\(age)歳です"
print(message) // 私は20歳です
これは便利だから、よく使われる書き方なんだよ。
StringとIntを混ぜて使うときの注意
"123"っていう文字列と、456っていう数字を足したらどうなるの?
試してみよう。
let stringNumber = "123"
let intNumber = 456
// let result = stringNumber + intNumber // エラー!
これはエラーになるんだ。「Binary operator '+' cannot be applied to operands of type 'String' and 'Int'」って、「+演算子はStringとIntには使えません」っていうエラーが出るんだよ。
Swiftは 型安全な言語 で、異なる型同士の操作を許さないんだ。もし計算したいなら、どちらかの型に揃える必要があるんだよ。
方法1: StringをIntに変換してから計算
let stringNumber = "123"
let intNumber = 456
if let num = Int(stringNumber) {
let result = num + intNumber
print(result) // 579
}
方法2: IntをStringに変換してから連結
let stringNumber = "123"
let intNumber = 456
let result = stringNumber + String(intNumber)
print(result) // "123456"(文字列として連結)
方法1は数値計算、方法2は文字列連結になるから、結果が全然違うよね。
型が違うと計算できないんだ!型って大事なんだね!
実践練習
じゃあ、練習問題をやってみよう。
問題1: 名前と年齢を変数で定義して、「〇〇さんは△△歳です」という文を文字列補間を使って出力してみて。
やってみる!
let name = "太郎"
let age = 25
let message = "\(name)さんは\(age)歳です"
print(message)
できた!
完璧だね!次の問題も試してみよう。
問題2: 商品の価格(1000円)と個数(3個)を定義して、合計金額を計算して「合計は〇〇円です」と出力してみて。
let price = 1000
let quantity = 3
let total = price * quantity
print("合計は\(total)円です")
こうかな?
素晴らしい!完璧だよ。StringとIntの両方を使いこなせているね。
まとめ
この記事では、SwiftのStringとInt型について学びました。
String(文字列型):
- テキストを扱う型
- ダブルクォーテーション
"で囲む +で連結できる- 文字列補間
\()で変数や式を埋め込める count、isEmpty、contains()などの便利なプロパティ・メソッド
Int(整数型):
- 整数を扱う型
- 算術演算子(
+、-、*、/、%)で計算できる - 整数の除算は小数を切り捨てる
- 約 -9京 から +9京 までの範囲
型の変換:
String(値)でIntからStringに変換Int(文字列)でStringからIntに変換(失敗する可能性あり)- 異なる型同士は直接計算できない(型の統一が必要)
次回は「基本的なデータ型②」として、小数(Double)と真偽値(Bool)について学びます。より多様なデータを扱えるようになりましょう!