Swift教室 Swift と競技プログラミングの教室

変数と型

読了目安 約3分

let と var で値に名前を付ける。Int、Double、String と型変換、オプショナルの入り口。

この章の目次

計算した値を後で使うには、値に名前を付けます。 値を入れておく名前付きの入れ物が変数です。

let で名前を付ける

Swift
let price = 100
print(price)
print(price * 3)

let 名前 = 値 で、値に名前が付きます。 = は「等しい」ではなく「右の値を左の名前に入れる」という指示です。

let で作った変数は定数と呼ばれ、後から値を変えられません。

Swift
let price = 100
price = 200
テキスト
main.swift:2:1: error: cannot assign to value: 'price' is a 'let' constant

var は後から変えられる

値を入れ替えたいときは var で作ります。

Swift
var count = 0
count = count + 1
count = count + 1
print(count)

count = count + 1 は「今の count に 1 を足して入れ直す」という意味です。

Swift の流儀は、まず let で書くことです。 値が変わらない名前が多いほど、コードを読むときに追いかける変化が減ります。 変えたくなったときだけ var に直します。

値の種類をと呼びます。

意味
Int整数42-7
Double小数2.53.0
String文字列"こんにちは"

右辺の値から型を自動で決める仕組みが型推論です。 let b: Double = 10 のように型を書いて指定する書き方は型注釈と呼びます。

Swift
let a = 10
let b: Double = 10
print(a, b)

型が違うと計算できない

IntDouble は直接足せません。

Swift
let a = 10
let b = 2.5
print(a + b)
テキスト
main.swift:3:9: error: binary operator '+' cannot be applied to operands of type 'Int' and 'Double'

Double(a) で整数を小数に、Int(b) で小数を整数に変換して、型をそろえてから計算します。

Swift
let a = 10
let b = 2.5
print(Double(a) + b)
print(a + Int(b))

試してみよう: print(Int(2.9)) を足して、四捨五入ではなく切り捨てになることを確かめてください。

オプショナル

readLine() は、標準入力から 1 行を文字列として読み込みます。 ただし結果の型は String ではなく String? です。

? 付きの型はオプショナルと呼ばれ、「値があるか、値なし」を表します。 入力が残っていなければ値なしです。 後ろに ! を付けると中身を取り出せますが、値なしだったときは「実行時エラー」で止まります。

Swift
let n = Int(readLine()!)!
print(n * 2)
入力例
21

Int("21") のような文字列から整数への変換も、数字でない文字列では失敗します。 だから変換の結果もオプショナルで、! がもう 1 つ必要です。

Int は 64 ビットの整数で、約 ±922 京(9.2 × 10^18)まで扱えます。

学びどころ

概念一言まとめ
let定数。まずこれで書くのが Swift の流儀
var後から値を入れ替えられる変数
Int / Double / String整数、小数、文字列の型
型推論右辺の値から型が自動で決まる
Int(x) / Double(x)型をそろえる変換。小数から整数は切り捨て
オプショナル値なしがありうる型。! で中身を取り出す

演習

1 行目に整数 N が入力されます。 N 年は何秒かを計算して出力してください。 1 年は 365 日とします(1 ≤ N ≤ 100000)。

テキスト
入力例:
1

出力例:
31536000
模範解答
Swift
let n = Int(readLine()!)!
print(n * 365 * 24 * 60 * 60)

N = 100000 でも答えは約 3.2 × 10^12 で、Int の範囲に収まります。