The Swift Programming LanguageのLanguage Guideの"The Basics"の章をざっとまとめたものです。
Objective-Cを始め、既に他の言語を習得されてる方向けです。
英語は苦手なので、ソースコードから逆読みしている箇所もあります。
間違いや補足等あれば、教えて頂ければ幸いです。
文末
行末又はセミコロンまでが文。行末のセミコロンは必須ではない.
定数
let 定数名 = 定数値 // 型推論
let 定数名: 型 = 定数値 // 型明示
定数名の先頭は、小文字でも大文字でもかまわない。
let ZERO = 0
let ONE:Int8 = 1 // 型を明示した場合
let PATH = "a/b/c"
要調査
// クラスの属性定義
let ZERO;
// クラスのコンストラクタか何かで、定数の初期値を設定することは可能?
ZERO = 0;
変数
// 型推論
var 変数名 = 10
// 型明示
var 変数名: 変数型
var name = "hmu29"
name = "hmu30"
識別子
変数名や定数名には、
- Unicodeが使える。
- 数字から始まってはいけない。
標準出力
グローバル関数printlnを使う。
println("hello world!")
message = "hello world!"
# \(変数名)で文字列中で変数の展開が行える。
println("message = \(message)")
コメント
ブロックコメントはネストも解決してくれるっぽい。
// インラインコメント
/*
ブロックコメント
*/
/*
/* これもコメント */
これもコメント!!
*/
Integer 整数
型
- UInt8
- Int32
- Int64
- Int ... 32bit platform=>Int32. 64bit platform=>Int64.
- UInt32
- UInt64
- UInt ... 32bit platform=>Int32. 64bit platform=>Int64.
最大値 最小値
let min = Int32.min
let max = Int32.max
定数値
整数
- プレフィックス無し... 整数
- プレフィックス0b ... 2進数
- 0o ... 8進数
- 0x ... 16進数
浮動小数点
10進数に対して
1.25e2 // 1.25 x 10^2 or 125.0
1.25e-2 // 1.25 x 10^2 or 0.0125.
16進数に対して
- 0xFp2 // 15 x 2^2 or 60.0
- 0xFp-2 // 15 x 2^-2 or 3.75.
桁区切り
_で桁を区切れる.
let million = 3_000_000
Float 浮動小数点
型
- Double ... 64bit
- Float ... 32bit
型セーフ
Swiftは型セーフな言語。(コンパイル時に型チェックを行う)
型推論
Swiftは変数や定数の初期値に応じて型を推論する
let たぶんInt = 10 // 整数値はIntと推論
let pi = 3.14 // 浮動小数点はDoubleと推論
型変換
整数値
変数、定数にその範囲外の値を入れる事はできない。
let val1: Int8 = Int8.max + 1 // コンパイルエラー
let val1: Int8 = Int8.max
var str = "127"
var val2 = str.toInt()
var val3: Int8 = Int8(val2!) // これはOK val3 == 127
// これは例外発生
var val4: Int8 = val1 + Int8(val2!)
浮動小数点->整数
Int()などでキャストできる
let val = Int(3.14)
型エイリアス
いわゆるtypedef.
typealias AudioSample = Unit16
Boolean
型名はBool型
値はtrue 又は false
if などの制御文内の式は、Booleanでないとダメ
let success = true
if success {
// 必ずここを通る
}
if 1 {
// 1 はコンパイルエラー
}
if 1 == 1 {
// 1 == 1 はtrue なのでOK
}
タプル
値の組み合わせを定義できる。
Laungauge guideにも一時的なスコープで利用する場合に便利とある
便利そうだけど、便利過ぎそう。。。
特にタプルの要素に名称を付けるなら、
構造体なりにした方が型的に安全なのでは...と感じる。
let http404Error = (404, "Not Found")
// タプルを展開
let(statusCode, message) = http404Error
println("code=\(statusCode), msg=\(message)")
// タプルの一部のみ展開
// 省略部を_で指定する
let(statusCode, _) = http404Error
println("code=\(statusCode)")
// 0. 1とインデックスでもアクセスできる
println("code=\(http404Error.0), msg=\(http404Error.1)")
// タプルに名称を指定もできる
let http404Error = (statusCode:404, message:"Not Found")
println("code=\(http404Error.statusCode), msg=\(http404Error.message)")
optional (nil許容)
Int型の変数などでnilを許容する場合にInt?型が使われる.
※ C#などでもSQLの実行結果を格納する際にnil許容型があったけど、そんな感じに利用するする?
let possibleNumber = "123"
let convertedNumber = possibleNumber.toInt()
// toIntはInt?を返す.
// Int?型は、変数の接尾辞が無指定の場合はnilかどうかを表し
if convertedNumber {
// 変数の接尾辞に!がつくと、その値を参照する.
// これをForced Unwarppingというらしい.
println("number=\(convertedNumber!)")
} else {
println("error!!")
}
変数の型にInt?を指定する事もできる
var result: Int? = 100
result = nil
nil
objective-cとは異なり、nilはポインタではない.オブジェクトが存在しない事を意味しない.
(...オブジェクトが存在しない、という意味のnilは何になったんだろう...)
Implicitly Unwapped Optionals
Int?ではなくInt!を使う事で、変数名!でなく、変数名のみでUnwrapped状態にしてくれる。(文法的にはC++のリファレンスみたいな?)
※ 変数に値が存在する事を前提する場合に、!が省略できて便利...?
いまのところ使い道が?
var val: Int! = 32
println(val=\(val))
nilチェックも可能
let val: Int? = nil
if val {
println(true)
} else {
println(false) // falseが出力される
}
Assert
メソッド処理時のオブジェクトの状態チェックや、引数のチェック、
処理後の状態チェックに使ったりする。
デバッガで実行時には、Assertの結果がfalseになると、そこで処理を止めてくれる。
let age = -3
assert(age >= 0, "error message")
※ Swiftでは未確認だけど、Cの場合、非デバッグ時には、assertは無視されるので、一般的にassert中で、副作用のある処理(変数に値を代入したりなど)を行うのはNG.