Int
、浮動小数点数に対する Double
と Float
、ブール値に対する Bool
、文字データに対する String
があります。また、3 つのより強力な collection 型(Array
, Set
, Dictionary
)も提供しています。詳細は Collection Types(コレクション型)に記載しています。nil
を扱うのに似ていますが、クラスだけではなく、あらゆる型に使用することができます。Objective-C の nil
ポインタよりも、安全で表現豊かなだけでなく、Swift の数々の強力な特徴の中心に位置します。String
が必要な場合に、この型安全な特徴が、間違って Int
を渡してしまうことを防いでくれます。同様に、オプショナルではない String
にオプショナルの String
を誤って渡してしまうことも防いでくれます。型安全なことで、開発中に、素早くエラーの発見と修正をすることができます。10
や文字列の "Hello"
など)と名前(maximumNumberOfLoginAttempts
や welcomeMessage
)を関連付けます。_定数_は一度値を設定すると変更することはできません。一方で、_変数_は後で異なった値を設定できます。let
、変数は var
キーワードで定義します。ここで、ユーザが何回ログインをしようとしたか試行回数を追跡する定数と変数の例を紹介します。maximumNumberOfLoginAttempts
という定数を定義して、10
という値を設定します。次に currentLoginAttempt
という変数を定義して、0
という初期値を設定します」,
)区切りで 1 行の中に複数の定数や変数を定義することもできます。NOTE コードで保持している値がこの先変更されない場合は、let
を使用して定数として定義してください。変数は変更できるようにする必要がある場合にのみ使用してください。
:
)を置いて、型注釈を書きましょう。welcomeMessage
という変数に型注釈を書いて String
が保持されることを示しています。String
型の welcomeMessage
という変数を定義します」String
型の」という句は、どんな String
型の値も保持できることを意味します。つまり、保持することができる「物事の型(種類)」だと考えましょう。welcomeMessage
にはエラーなしに文字列を設定できます。NOTE 実際に型注釈を書く必要はあまりありません。定義時に定数や変数に初期値を与えた場合、 Swift はたいていそれらの型を推論できます(詳細はType Safety and Type Inference(型安全と型推論)。上記のwelcomeMessage
の例では、初期値を与えていないため、推論をすることができないため、welcomeMessage
変数は型注釈で型を特定しています。
NOTE Swift の予約語と同じ名前の定数や変数を使いたい場合、そのキーワードをバッククォート(`)で囲みます。可能ではありますが、予約語を名前に使用することは本当に他に選択肢がない以外は避けましょう。
friendlyWelcome
の値を "Hello!"
から "Bonjour!"
に変更しています。print(_:separator:terminator:)
関数を使用して、定数や変数の現在の値を出力することができます。print(_:separator:terminator:)
関数はグローバル関数で、1 つ以上の値を適切なアウトプット先に出力します。Xcode では、print(_:separator:terminator:)
関数を使用すると、 Xcode のコンソールパネルへ値を出力します。separator
と terminator
パラメータには、デフォルト値が用意されているので省略可能です。デフォルトでは最後に改行を追加します。改行を付けたくない場合は terminator
に空文字を渡してください。例えば print(someValue, terminator: "")
。詳細はDefault Parameter Values(デフォルトパラメータ値)。()
)で囲み、開始括弧の前にバックスラッシュ(\
)を付けます。//
)で開始します。/*
)で開始し、アスタリスク+スラッシュ(*/
)で終了します。;
)を付ける必要がありません(付けることも可能ではあります)。一方で、1 行に複数のステートメントを書きたい場合は必要になります。42
、-23
など)。整数とは_符号付き(正の値、または 0、または負の値) または_符号なし_(正の値、または 0) です。UInt8
、32 ビットの符号付き整数は Int32
です。Swift の全ての型と同様に、これらの整数値型の頭文字は大文字です。min
と max
プロパティを使用して、各整数値型の最小値と最大値にアクセスすることができます。UInt8
)で、同じ型の他の値と一緒に式の中で使用することができます。Int
という型を提供しています。Int
は Int32
と等しいInt
は Int64
と等しいInt
を使用するようにしてください、これはコードの一貫性と互換性を保つ手助けとなります。32 ビットのプラットフォームでは、Int
は -2,147,483,648
から 2,147,483,647
まで保持することができます。これは整数値が使われる多くの場合において、十分に大きい範囲です。UInt
は UInt32
と等しいUInt
は UInt64
と等しいNOTEUInt
は特別にプラットフォームに応じて決まるサイズと同じサイズの 符号なし整数型を扱いたい場合にのみ使用してください。そうでない場合、負の値にならないとしてもInt
を使用する方が好ましいです。一貫してInt
を整数値に使用することで、異なる整数値型間の変換を避け、合致する型をコンパイラが推論することで、互換性を保つことができます。詳細はType Safety and Type Inference(型安全と型推論)。
3.14159
, 0.1
, -273.15
など)。Int
より大きい(またはより小さい)値を保持できます。Swift は 2 つの符号付き浮動小数点数値型を提供しています。Double
は 64 ビットの浮動小数点数を表しますFloat
は 32 ビットの浮動小数点数を表しますNOTEDouble
は最小で15桁の精度の小数値を持ち、Float
は6桁の精度の小数値を持ちます。適切な浮動小数点数値型は、扱いたい数値の特性と範囲によります。どちらでも良い場合は、Double
が好まれます。
String
が必要な場合に、間違って Int
を渡すようなことはありません。42, 3.14159
のような値のことです)42
を新しい定数に型を記載せずに代入すると、整数値型に見える数値リテラルで初期化していることから、Swift はその型を推論して Int
と判断します。Double
を定義したと推論します。Float
よりも)Double
を選択します。Double
と推論されます。3
には明確な型がありませんが、後ろの浮動小数点数の値から Double
と推論されます。0b
をプレフィックスにした 2 進数0o
をプレフィックスにした 8 進数0x
をプレフィックスにした 16 進数17
という 10 進数を下記のように保持します。e
)。16 進数の浮動小数点数は必ず指数を指定しなければなりません(小文字または大文字の p
)。exp
の指数を持つ 10 進数では、元の値に1.25e2
は 1.25 x 125.0
と等しい1.25e-2
は 1.25 x 0.0125
と等しいexp
の指数を持つ 16 進数では、元の値に0xFp2
は 15 x 60.0
と等しい0xFp-2
は 15 x 3.75
と等しい12.1875
という 10 進数を表しています。_
)を追加することで可読性を向上させることができます。このフォーマットに整数値自体への影響はありません。Int
型を使いましょう。全ての状況でデフォルトに Int
を使用することで、整数値の定数と変数を特別な手順なしに互換可能にし、数値リテラルから推論される型とも合致します。Int8
の定数や変数は、−128
から 127
まで保持できます。UInt8
の定数や変数は、0
から 255
まで保持できます。指定したサイズの整数値型の定数や変数に合わない値を設定しようとするとエラーになります。twoThousand
は UInt16
ですが、定数の one
は UInt8
です。この 2 つは同じ型ではないので直接足し算をすることができません。そこで、この例では、one
を使用して UInt16
の新しい値を作るために UInt16(one)
を呼び、元の値に置き換えて使います:UInt16
なので、足し算は可能です。そして計算結果の定数(twoThousandAndOne
)も UInt16
に推論されます。SomeType(ofInitialValue)
という形式は、初期値を渡して初期化を行う Swift のデフォルトの方法です。裏側では、UInt16
型が UInt8
の値を受け取って、新しい UInt16
型の値を生成しています。とはいっても、あらゆる型を渡せるわけではありません。UInt16
型が提供するイニシャライザに合った型が必要です。新しい型を渡して初期化する方法は、Extensions(拡張)に記載しています。3
の値が Double
型の新しい値を作って使われています。そのため、両方の型が同じになり、足し算が可能です。変換をしない場合、足し算はできません。Double
や Float
で初期化できます。4.75
は 4
、-3.9
は -3
になります。NOTE 整数値の定数と変数を組み合わせるルールは、数値リテラルのルールとは異なります。リテラル値の3
はリテラル値の0.14159
とそのまま加算できます。リテラル値は明示的な型を有していないため、コンパイラがその値を評価するときに型を推論します。
typealias
キーワードを使います。AudioSample
が UInt16
のタイプエイリアスとして定義されています。エイリアスなので、AudioSample.min
の実態は UInt16.min
で、maxAmplitudeFound
の初期値は 0
になります。Bool
と呼ばれる基本的なブール値を持っています。ブール値は、真(true)か偽(false)のみを値として取ることから、_論理値(logical)_として参照されます。Swift では true
と false
の 2 つのブールの定数を提供しています。orangesAreOrange
と turnipsAreDelicious
は、ブール値リテラルで初期化されていることから Bool
と推論されます。これまで見てきた Int
や Double
のように、true
や false
を値に設定すれば、明示的に Bool
と指定する必要はありません。既に型がわかっている他の定数や変数を使用して初期化する際に、Swift の型推論を活用することで、より簡潔で読みやすいコードを書くことができます。if
文など:Bool
以外の値を Bool
として使うことはできません。次の例はコンパイルエラーになります:(404, "Not Found")
は、 HTTP ステータスコードを表したタプルです。HTTP ステータスコードは、Web ページを取得するリクエストを送ると Web サーバから返ってくる特別な値です。404 Not Found
のステータスコードは、リクエストした Web ページが存在しなかった場合に返ってきます。(404, "Not Found")
タプルは、HTTP ステータスコードを 2 つの値:(数値と人が理解できる説明文)に分けた Int
と String
を 1 つのグループにまとめています。これは「(Int, String)
型のタプル」と説明できます。(Int, Int, Int)
や (String, Bool)
型のタプルも作ることができますし、必要に応じて順番の入れ替えも可能です。_
)を使用して無視することができます。(Int, String)
で返すかもしれません。2 つの異なる型の値を持ったタプルを返すことで、1 つの型の 1 つの値を返すよりも、関数はより有益な情報を提供できます。より詳しくは、Functions with Multiple Return Values(複数の戻り値がある関数)を参照ください。NOTE オプショナルの概念は、 C 言語や Objective-C には存在しません。Objective-C は、メソッドからnil
かオブジェクトを返すことができますが、ここでいうnil
は「妥当なオブジェクトが存在しない」、ということを意味します。しかし、これはオブジェクトのみで機能し、構造体や基本的な C 言語の型、列挙型には使用できません。これらの型へは、値が存在しないことを示す特別な値(NSNotFound
など)を返すのが通例です。この方法ですと、メソッドの呼び出し元が、この特別な値が返ってくることを前提としてチェックすることを想定しています。Swift では、この特別な値を必要とせず、どんな型に対しても値が存在しないことを示すことができます。
Int
型には String
を Int
へと変換するイニシャライザがあります。しかし、全ての文字列が Int
に変換できるわけではありません。「123
」という文字列は数値 123
に変換できますが、「hello world
」は変換することができません。String
を Int
へ変換するイニシャライザの例です。Int
ではなく、_オプショナル_の Int
を返します。オプショナルの Int
は、Int
ではなく Int?
と書きます。?
はオプショナルを示し、ある Int
型の値を含んでいる、または値が_全く存在しない_ことを表しています。(Bool
や String
など他の型を含めることはできません。Int
か nil
です)nil
を代入することで、値のない状態を設定することができます:NOTE オプショナルではない定数と変数にはnil
を設定することができません。もし、ある条件で値のない状態を扱う必要がある場合、適切な型のオプショナル値として定義してください
nil
が設定されます:NOTE Swift のnil
は Objective-C のnil
と同じではありません。Objective-C では、nil
は存在しないオブジェクトのポインタです。Swift では、nil
はポインタではありません。ある型の存在しない値です。オブジェクト型だけではなく、どんな型のオプショナルにもnil
を設定することができます。
if
文を使用してオプショナル値を nil
と比較することで、値を含んでいるかどうかのチェックができます。この比較は、等しい(==
)または等しくない(!=
)演算子を使用して行います。nil
と「等しくない」と見なされます。!
を付けることで、中の値に直接アクセスすることができます。!
は「私はこのオプショナルが値を含んでいることが 100%わかっています。だから使わせてください」ということを実質的に宣言していることになります。これはオプショナルの_強制アンラップ_と呼ばれています。NOTE 値が存在しないオプショナル値に!
を付けてアクセスしようとすると、実行時エラーが発生します。!
を使った強制アンラップを行う際は、確実にnil
ではないことを常に確かめましょう。
if
や while
文の 1 つのアクションで、オプショナル値に値が存在することを証明し、定数や変数にその内部の値を設定することを、まとめて行うことができます。if
や while
の詳細はControl Flow(制御フロー)を参照ください。if
文でオプショナルバインディングを行う場合、次のように書きます:Int(possibleNumber)
が返すオプショナルの Int
が値を含んでいた場合、actualNumber
にその値を設定します」actualNumber
定数は if
文の最初の分岐内で使用することができます。オプショナル_内に_ラップされている値で既に初期化は完了しているので、!
を後ろに付ける必要はありません。この例では、actualNumber
は変換した結果を出力します。myNumber
に値が含まれているかどうかを確認することから始まります。myNumber
に値がある場合、myNumber
という名前の新しい定数の値がその値に設定されます。if
文の本文内では、myNumber
は新しいオプショナルではない定数が参照されます。if
文の開始前と終了後で myNumber
を使うと、オプショナルの定数 Int
が参照されます。if
文の最初の分岐内で actualNumber
を変更したい場合は、if var actualNumber
と書くことで、定数の代わりに変数としてこのオプショナル値を使用できます。if
文の中に、複数のオプショナルバインディングとブール値をカンマ(,
)区切りで含めることができます。そのうちのいずれかが nil
または false
の場合、if
文全体が false
と判断されます。次の if
文はこれに該当します。NOTEif
文の中でオプショナルバインディングによって作られた定数や変数は、if
文の中でしか使えません。もし他でも使用したい場合は、guard
文を使用することで、guard
文の次から使用することができます。詳細はEarly Exit(早期リターン)に記載しています。
if
文の中でチェックでき、存在している場合は、オプショナル内の値にアクセスするために、オプショナルバインディングを使用してアンラップすることができます。?
の代わりに !
を型の後に付けることで、暗黙アンラップオプショナルを書くことができます(String?
の代わりに String!
と書くなど)。コード内で使用するオプショナル値の後に !
付けるよりも、定義した型の後に !
を付けます。String
を型として記載している値へアクセスするときの動きの違いを表しています。assumedString
は、implicitString
が明示的にオプショナルではない String
を宣言しているため、代入される前に強制アンラップされています。下記のコードでは、optionalString
は明示的に型を宣言していないため、通常はオプショナルになります。nil
の場合に内部の値にアクセスしようとすると、実行時エラーが発生します。これは !
を付けた通常のオプショナルで値が存在しない場合にアクセスしたときの動きと同じです。nil
かどうかのチェックは通常のオプショナルと同じ方法でできます。NOTE 暗黙アンラップオプショナルを、後でnil
になる可能性のある変数に使わないでください。変数が使用されている間にnil
チェックが必要な場合は、通常のオプショナルを常に使いましょう
throws
キーワードを含めることで、エラーをスローすることを示せます。エラーをスローする関数を呼ぶ場合、式の前に try
キーワードを付けます。catch
でエラーがキャッチされるまで、現在のスコープを抜けてエラーを自動で伝播します。do
は新しいスコープを生成して、エラーを 1 つ以上の catch
句でキャッチすることができます。makeASandwich()
関数は、綺麗な皿を使えない場合や材料が足りない場合、エラーをスローします。makeASandwich()
はエラーをスローする可能性があるため、この関数の呼び出しは try
式で包まれています。do
文で関数の呼び出しを包み、スローされたエラーは catch
句でキャッチされます。eatASandwich()
関数が呼ばれます。エラーがスローされ、それが SandwichError.outOfCleanDishes
case と合致する場合、washDishes()
関数が呼ばれます。SandwichError.missingIngredients
ケースに合致する場合、buyGroceries(_:)
関数が catch
でキャッチされた [String]
値をパラメータに呼び出されます。true
と評価される場合、コードは通常通り継続します。false
の場合、現在のプログラムの状態は不正となり、コードの実行は中断し、アプリは終了します。true
か false
と評価される式と、false
だった場合に出力するメッセージを式として渡すことができます。例えば:age >= 0
、つまり負の値ではない場合、が true
でコードは継続して実行されます。負の値の場合、age >= 0
は false
となり、アサーションは失敗しアプリは終了します。false
になる可能性があるものの、コードの実行を継続するためには_必ず_ true
にならなければならない条件に対しては、事前条件を使いましょう。例えば、subscript が範囲超えエラーを起こしていないかの確認や、適切な値を関数に渡しているかなどには、事前条件を使いましょう。true
か false
と評価される式と、false
だった場合に出力するメッセージを式として渡すことができます。例えば:NOTE もし(-Ounchecked
)モードでコンパイルした場合、事前条件はチェックされません。コンパイラは事前条件を常にtrue
とみなしてコードの最適化を行います。一方で、fatalError(_:file:line:)
関数は最適化の設定をしても、常に実行を中断します。fatalError(_:file:line:)
関数は、試作段階や開発の初期段階で、まだ未実装であることを示すためのスタブとして使用することができます(fatalError("Unimplemented")
と書くなど)。fatal error はコードの最適化がされないため、アサーションと事前条件とは異なり、もしこのスタブメソッドに遭遇した場合は、確実に実行を中断させることができます