トップページ » タイプ変換
20 Jun 2014 03:11公開
※「タイプ変換」はまだ工事中です。まず「Swiftの全貌を探る」シリーズの記事を参考してください。
Swiftは新言語とはいえ、ほとんどの機能はCとObject-Cの開発者にとって馴染みのある機能です。
SwiftはC、Object-Cと同じように下記の基本タイプが存在します。
Int
UInt
Double
Float
Bool
String
Array
Dictionary
また、Swiftはオプショナルを新たに追加されました。
定数と変数
Swiftに定数と変数は平等に使われています。
定数と変数の宣言
letで定数、varで変数を宣言します。
let maximumNumberOfLoginAttempts = 10 //定数 var currentLoginAttempt = 0 //変数 var x = 0.0, y = 0.0, z = 0.0 //複数の変数を一行で宣言
ノート:変更するニーズがなければ、Swiftは定数を推奨します。
型のアノテーション
「:型のアノテーション」で定数と変数の型を宣言します。
var welcomeMessage: String
明確な記述がなければ、暗黙に型は推測されます。
welcomeMessage = "Hello"
ノート:ほとんどの場合、型は暗黙に推測されます。型のアノテーションはめったにしかないケースです。
定数と変数のネーミング
定数と変数のネーミングはUnicodeが使えます。例えば、
let π = 3.14159 let ようこそ = "世界、ようこそ"
但し、定数と変数名は数学記号、矢印、私的(または無効な)Unicodeコードポイント、またはライン、ボックス描画文字を含めることはできません。また、頭文字は数字が利用できません。
バックティック「`」で囲い込めば、Swiftの予約語をネーミングで利用できます。
変数と定数の出力
println、printで出力ができます。
また、文字列の補間(String Interpolation)「\(定数、変数)」で定数、変数の出力ができます。
let friendlyWelcome = "Bonjour!" println ( friendlyWelcome ) // "Bonjour!"をコンソールに出力します。 println("This is a string") // "This is a string"をコンソールに出力します。 println("The current value of friendlyWelcome is \(friendlyWelcome)") // "The current value of friendlyWelcome is Bonjour!" をコンソールに出力します。
コメント
// 一行のコメント /* マルチライン コメント */ /* ネストコメント /* ネストインサイドコメント */ マルチライン */
セミコロン
一行に複数のステートメントを記述するだけ、セミコロンが必要です。
let cat = "猫"; println(cat) // "猫"を出力
整数
UInt8
UInt16
UInt32
UInt64
Int8
Int16
Int32
Int64
整数の範囲
min、maxのプロパティーで型の範囲を取得できます。
let minValue = UInt8.min // minValueは0, そしてタイプはUInt8 let maxValue = UInt8.max // maxValueは255, そしてタイプはUInt8
Int
32ビットのプラットフォームでは、 IntはInt32と同じサイズです。
64ビットのプラットフォームでは、 IntはInt64と同じサイズです。
UInt
32ビットのプラットフォームでは、 UIntはUInt32と同じサイズです。
64ビットのプラットフォームでは、 UIntはUInt64と同じサイズです。
浮動小数点数
Doubleは64ビットの浮動小数点数を表す。浮動小数点値が非常に大きいか、特に正確でなければならないとき使用してください。
Floatは32ビットの浮動小数点数を表す。浮動小数点値は、64ビットの精度を必要としないとき使用してください。
Doubleは少なくとも15桁の精度を持ちます。Floatは6桁だけです。
タイプセーフと型推論
スウィフトは、 タイプセーフな言語です。タイプセーフ言語は、コードが扱うことのできる値の種類について明確にすることを奨励します。
スウィフトはタイプセーフなので、あなたのコードやフラグエラーなどの任意の一致しない型をコンパイル時に型チェックを実行します。これをキャッチし、できるだけ早期の開発プロセスでエラーを修正することができます。
型チェックを使用すると、値の異なる種類で作業しているときにエラーを回避することができます。しかし、すべての定数、変数の宣言にて型を指定する必要があることを意味するものではありません。値の型を指定しなければ、スウィフトは、型推論で適切な型を選びます。
初期値の定数または変数を宣言するときに型推論は、特に便利です。これは、多くの場合、あなたはそれを宣言時点での定数または変数にリテラル値 (またはリテラル ) を割り当てることによって行われます。(リテラル値では、以下のようなソースコードに直接表示される値であり、例えば 42および3.14159。)
let meaningOfLife = 42 // Int let pi = 3.14159 // Double let anotherPi = 3 + 0.14159 // Double
数値リテラル
プレフィックスなし場合、10進数
0bのプレフィックス、2進数
0oのプレフィックス、8進数
0xのプレフィックス、16進数
let decimalInteger = 17 let binaryInteger = 0b10001 // 17 in binary notation let octalInteger = 0o21 // 17 in octal notation let hexadecimalInteger = 0x11 // 17 in hexadecimal notation
1.25e2 は1.25 × 10^2, また 125.0.
1.25e-2 は 1.25 × 10^-2, また 0.0125.
0xFp2 は 15 × 2^2, また 60.0.
0xFp-2 は 15 × 2^-2, また 3.75.
12.1875は
let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0
数値リテラルは読みやすくするために、余分な書式を含めることができます。整数と浮動小数点数の両方が、余分なゼロが埋め込ますることができます。また、読みやすくするためアンダースコアを含めることもできます。どちらでも値を影響しません。
let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1
数値型の変換
整数変換
let cannotBeNegative: UInt8 = -1 // UInt8 はマイナスを格納できません。エラー let tooBig: Int8 = Int8.max + 1 // Int8の最大値を上回りました。エラー
特定のタイプを変換するには、既存の値との希望のタイプの新しい数字タイプを初期化すべきます。以下の例では、定数twoThousandはUInt16、 oneはUInt8 、同じタイプではないので、直接加算することができません。代わりに、UInt16(one)を実行して、新たにUInt16を作成し、oneで初期化します。
let twoThousand : UInt16 = 2_000 let one : UInt8 = 1 let twoThousandAndOne = twoThousand + UInt16 ( one )
SomeType(ofInitialValue)はSwiftの型の初期値を渡すコンストラクターを呼び出します。裏では、 UInt16はUInt8値を受け入れるコンストラクターを持っています 。ただし、ここでは任意の型を渡すことができません。(自分の型定義を含む)を新しい型を受け入れるコンストラクター提供するために、拡張(Extension) で拡張してください。
整数と浮動小数点の変換
let three = 3 let pointOneFourOneFiveNine = 0.14159 let pi = Double(three) + pointOneFourOneFiveNine // pi = 3.14159, Double let integerPi = Int(pi) // integerPi = 3, Int
ノート:数値定数と変数を結合のルールは、数値リテラルのルールとは異なります。数値3は0.14159数値と直接加算することができます。それ自体の明示的な型を持っていないので、その型はコンパイラの時点で推測されます。
タイプエイリアス
typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min // maxAmplitudeFound は 0
Booleans
let orangesAreOrange = true let turnipsAreDelicious = false if turnipsAreDelicious { println("Mmm, tasty turnips!") } else { println("Eww, turnips are horrible.") } // "Eww, turnips are horrible."が出力されます
let i = 1 if i { // コンパイルエラーが起こる }
let i = 1 if i == 1 { // 正常にコンパイルされる }
タプル(Tuple)
タプルで複数の値をひとつの複合値としてまとめることができます。
let http404Error = (404, "Not Found") // http404Error is of type (Int, String), and equals (404, "Not Found")
タプルを分解することもできます。
let (statusCode, statusMessage) = http404Error println("The status code is \(statusCode)") // prints "The status code is 404" println("The status message is \(statusMessage)") // prints "The status message is Not Found" println("The status code is \(http404Error.0)") // prints "The status code is 404" println("The status message is \(http404Error.1)") // prints "The status message is Not Found" let http200Status = (statusCode: 200, description: "OK") println("The status code is \(http200Status.statusCode)") // prints "The status code is 200" println("The status message is \(http200Status.description)") // prints "The status message is OK"
ノート:タプルは、関連する値の一時的なグループのためには便利です。複雑なデータ構造の構築には適切ではありません。データ構造は、クラスや構造体を利用すべきです。
オプショナル
値が存在しなくてもよいニーズを対応するため、Swiftはオプショナルを提供します。オプショナルの意味は:
- 特定型の値があります
- または、値がまったくありません
let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber is inferred to be of type "Int?", or "optional Int"
if文と強制アンラッピング
if convertedNumber { println("\(possibleNumber) has an integer value of \(convertedNumber!)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123"
ノート:!で存在しないオプションの値にアクセスする場合、実行時エラーがトリガされます。強制的にラップを解除の前に、常にオプションに値が含まれていることを確認すべきです。
オプションバインディング
if let constantName = someOptional { statements }
if let actualNumber = possibleNumber.toInt() { println("\(possibleNumber) has an integer value of \(actualNumber)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123"
nil
var serverResponseCode: Int? = 404 // serverResponseCode contains an actual Int value of 404 serverResponseCode = nil // serverResponseCode now contains no value
var surveyAnswer: String? // surveyAnswer is automatically set to nil
ノート:スウィフトのnilはObjective-Cの中のnil同じではありません。 Objective-Cで、 nilは存在しないオブジェクトへのポインタです。スウィフトでは、 nilはポインタではなくて、特定の型の値が存在しないことです。任意の型のオプションをにnilを設定することができます。オブジェクト·タイプだけではありません。
暗黙的にオプションのアンラップ
let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value // prints "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // no exclamation mark is needed to access its value // prints "An implicitly unwrapped optional string."
if assumedString { println(assumedString) } // prints "An implicitly unwrapped optional string."
if let definiteString = assumedString { println(definiteString) } // prints "An implicitly unwrapped optional string."
アサーション
アサーションを使用したデバッグ
let age = -3 assert(age >= 0, "A person's age cannot be less than zero") // this causes the assertion to trigger, because age is not >= 0 assert(age >= 0)
アサーションを使用するケース
シリーズ
記事のリスト
- タイプ変換
レーティング
コメント