定数と変数
// 定数 let maximumNumberOfLoginAttempts = 10 // 変数 var currentLoginAttempt = 0 // 複数の定数または複数の変数は、コンマ区切り var x = 0.0, y = 0.0, z = 0.0 // 型宣言 var welcomeMessage: String // 複数の変数の型宣言 var red, green, blue: Double // 定数と変数の命名 let π = 3.14159 let 日本語 = "日本語の変数名" let 🐶🐮 = "dogcow" // 定数と変数の印刷 let helloWorld = "Hello World!" print(helloWorld) print("\(helloWorld) こんにちは")
コメント
複数の定数または複数の変数を、コンマで区切って1行で宣言できます。
// C++ Style // This is a comment. // C Style /* This is also a comment but is written over multiple lines. */ // ネストされたコメント /* Cの複数行コメントとは異なり、 /* Swiftの複数行コメントは他の複数行コメント内にネストできます。 */ コメント入りのコードをコメントアウトすることができる */
セミコロン
// 1行に複数の個別のステートメントを記述したい場合 let cat = "🐱"; print(cat)
整数
Intは、32ビットプラットフォームではInt32、64ビットプラットフォームではUInt64。
UIntは、32ビットプラットフォームではUInt32、64ビットプラットフォームではUInt64。
浮動小数点数
Double 64ビット浮動小数点数。通常は、こちらを推奨。
Float 32ビット浮動小数点数。
Type Safe と型推論
Swift は Type Safe。
浮動小数点は、既定でDoubleとなる。
let pi = 3.14159
Numeric リテラル
// 十進数 let decimalInteger = 17 // 二進数 let binaryInteger = 0b10001 // 八進数 let octalInteger = 0o21 // 十六進数 let hexadecimalInteger = 0x11 // 浮動小数点 let decimalDouble = 12.1875 // 十進数は、10exp。 let exponentDouble = 1.21875e1 // これは、12.1875 // 十六進数は、2exp let hexadecimalDouble = 0xC.3p0 // これは、12.3 の2の0乗 // 整数と浮動小数点では、0が先行しても良い let paddedDouble = 000123.456 // 読みやすさのために、"_"を間に挟んでも良い let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
数値型変換
整数変換
整数の場合は、自動的に型変換が行われる。
// Error UInt8 = -1 Int8 = Int8.max + 1
整数と浮動小数点の変換
// 整数型と浮動小数点型の間の変換は明示的に行う必要がある。 let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine // 浮動小数点から整数への変換も明示的に行う必要がある。 let integerPi = Int(pi) // この場合、浮動小数点値は常に切り捨てられる。 // 例えば、4.75 >>> 4、 -3.9 >>> -3 になる。
タイプエイリアス
typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound is now 0
Bool
trueまたはfalse
let i = 1 if i { } // これはコンパイルエラーになる。
タプル
複数の値を単一の複合値にグループ化したもの。タプル内の値は任意のタイプを持つことができる。関数の戻り値としてよく使われる。
let http404Error = (404, "Not Found") // 分離 let (statusCode, statusMessage) = http404Error print("The status code is \(statusCode)") print("The status message is \(statusMessage)") // アンダースコアの部分は無視される let (justTheStatusCode, _) = http404Error print("The status code is \(justTheStatusCode)") // ゼロから始まるインデックス番号を使用して、タプル内の個々の要素の値にアクセスできる。 print("The status code is \(http404Error.0)") // Prints "The status code is 404" print("The status message is \(http404Error.1)") // Prints "The status message is Not Found" // タプル内の個々の要素に名前を付けることができる。 let http200Status = (statusCode: 200, description: "OK") print("The status code is \(http200Status.statusCode)") // Prints "The status code is 200" print("The status message is \(http200Status.description)") // Prints "The status message is OK"
オプショナル
// nil になる可能性がある場合 let possibleNumber = "123" let convertedNumber = Int(possibleNumber) // convertedNumber is inferred to be of type "Int?", or "optional Int"
nil
値のない状態
var serverResponseCode: Int? = 404 serverResponseCode = nil // デフォルト値を指定せずにオプションの変数を定義すると、nilとなる var surveyAnswer: String? // surveyAnswer は、nil で定義される
Swiftでは、nil はポインターではなく、特定の型の値がないことを示しています。オブジェクトタイプだけでなく、任意のタイプのオプションをに設定できます。
if文と強制アンラップ
if
ステートメントを使用して、オプションとを比較することにより、オプションに値が含まれているかどうかを確認できますnil
。この比較は、「等しい」演算子(==
)または「等しくない」演算子(!=
)を使用して実行します。
オプションに値がある場合、「等しくない」と見なされますnil
。
if convertedNumber != nil { // 値が存在している // !をつけることにより、値を強制アンラップできる。 // 存在しない値にアクセスしようとすると、ランタイムエラーが発生する。 // 強制アンラップする前に、nil ではないことを必ず確認すること。 print("\(convertedNumber!).") }
オプショナル バインディング
if文、while文で、値が含まれているかどうかを調べ、含まれている場合は、その値を一時的な定数または変数として使用できるようにする。
if let constantName = someOptional { statements } // 強制アンラップは、次のように書き換えることができる。 if let actualNumber = Int(possibleNumber) { // 値が存在している print("\(actualNumber)") } // Optional Bindingをコンマで区切って含めることができる。 if let firstNumber = Int("4"), let secondNumber = Int("42") { print("\(firstNumber) and \(secondNumber) ") } // これは、次の文と同等 if let firstNumber = Int("4") { if let secondNumber = Int("42") { print("\(firstNumber) < \(secondNumber)") } }
guard 文は、別途説明。
暗黙的にアンラップされたオプショナル
// オプショナル let possibleString: String? = "An optional string." // ! による強制アンラップが必要 let forcedString: String = possibleString! // requires an exclamation point // 暗黙的にアンラップされたオプショナル let assumedString: String! = "An implicitly unwrapped optional string." // ! による強制アンラップは必要ない。 let implicitString: String = assumedString // 次の場合は、オプショナル let optionalString = assumedString // 暗黙的にアンラップされたオプショナル if assumedString != nil { print(assumedString!) } // 暗黙的にアンラップされたオプショナル if let definiteString = assumedString { print(definiteString) }
エラー処理
エラー処理を使用して、プログラムの実行中に発生する可能性のあるエラー条件に対応します。
値の有無を使用して関数の成功または失敗を伝えることができるオプションとは対照的に、エラー処理では、失敗の根本的な原因を特定し、必要に応じて、プログラムの別の部分にエラーを伝播できます。 。
関数がエラー条件を検出すると、エラーをスローします。その関数の呼び出し元は、エラーをキャッチして適切に応答できます。
func canThrowAnError() throws { // エラーを throw することができる } do { try canThrowAnError() // エラーはthrowされなかった } catch { // エラーがthrowされた } // Swiftは、エラーがcatch節で処理されるまで、自動的に現在のスコープから伝播します。 // さまざまなエラー条件に応答する方法 func makeASandwich() throws { // ... } do { try makeASandwich() eatASandwich() } catch SandwichError.outOfCleanDishes { washDishes() } catch SandwichError.missingIngredients(let ingredients) { buyGroceries(ingredients) }
アサーションとプリコンディション
アサーションとプリコンディションは、実行時に行われるチェックです。これらを使用して、さらにコードを実行する前に、必須条件が満たされていることを確認します。アサーションまたはプリコンディションが true の場合、コードの実行は通常どおり続行されます。false の場合、コードの実行が終了し、アプリが終了します。
アサーションと前提条件の違い
アサーションはデバッグビルドでのみチェックで、開発中の間違いや誤った仮定を見つけるのに役立つ。
前提条件はデバッグビルドと本番ビルドの両方でチェックされ、本番環境で問題を検出するのに役立つ。
アサーションを使用したデバッグ
let age = -3 assert(age >= 0, "A person's age can't be less than zero.") // このアサーションは、失敗する。 // アサーションメッセージを省略可能 assert(age >= 0) // 既に条件をチェックしているので、無条件にアサーションに失敗する場合 if age >= 0 { print("You can ride the ferris wheel.") } else { assertionFailure("A person's age can't be less than zero.") }
プリコンディションの適用
// 実行を継続するためには必ず trueでなければならない precondition(index > 0, "Index must be greater than zero.")