タイプ変換

トップページ » タイプ変換

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!"
printlnfriendlyWelcome// "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 twoThousandUInt16 = 2_000
let oneUInt8 = 1
let twoThousandAndOne = twoThousand + UInt16one

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)

アサーションを使用するケース


シリーズ

記事のリスト

  • タイプ変換

レーティング

rating: 0+x

コメント

Add a New Comment
当サイトコンテンツライセンスについて個別な指定がなければCreative Commons Attribution-ShareAlike 3.0 Licenseをベースします。転載や引用は大歓迎です。但し、転載・引用・二次利用の場合は当サイト記事へのURLをリンクし出典を明記してください。各作品を大切にして下さい。 また、記事及びコメントを投稿する皆さまも上記のライセンスを理解した上投稿して下さい。 当サイトのコンテンツは皆さまの投稿で作成されますから、当サイトの意思を反映しておりませんが、第三者の知的財産権などの侵害がある場合、当サイトの運営担当にご連絡ください。