https://developer.apple.com/swift/ より
まだコード書いていません。
とりあえずThe Swift Programming Language (iBooks Store)をざっくり目を通してつらつらと。
こちらに続きがあります。
定数と変数
定数は let
で、変数は var
で。:
で型指定できる。
配列とディクショナリ(連想配列)
配列 : [value0,value1,value2]
ディクショナリ : [key1:value1,key2:value2]
let
で宣言すれば immutable で、var
で宣言すれば mutable 。
配列
in
でイテレーション。
配列の要素の型を指定する時は型に[]
をつける。例えば、String[]
。
(2014.07.08 追記) beta 3 より [String]
と括弧で囲む書式に変更されました (上記書式も引き続きサポートされています)。
ディクショナリ
in
でイテレーション。キーとバリューを双方取る。
for (key, value) in dictionary {
}
キーだけ回したい時はkeys
を使う
for key in dictionary.keys {
}
バリューだけ回したい時はvalues
を使う
for values in dictionary.values {
}
ディクショナリで型を指定する場合は<>
を使う。例えば、Dictionary<Int, String>
制御文
for-in ループ
for
〜 in
で要素をイテレーションできる。
for value in array {
}
開始...終了
で範囲イテレーション。この場合、終了の値を含む。
for value in 1...5 {
// value は 1 から 5
}
開始..終了
とした場合、終了の値を含まない。
for value in 0..5 {
// value は 0 から 4
}
for ループ
初期値と条件と変化値を指定するいわゆるfor
ループ
for 初期; 条件; 変化 {
実行
}
こんな感じ
for var i=0; i<n; ++i {
}
while ループ
初期
while 条件 {
実行
変化
}
初期
do {
実行
} while 条件
if
まぁ、普通にif
文です。
if 条件1 {
} else if 条件2 {
} else {
}
switch
switch
には列挙子や整数以外、文字や範囲指定なんかも行えます。
switch count {
case 0:
naturalCount = "no"
case 1...3:
naturalCount = "a few"
switch anotherCharacter {
case "a":
case "A":
println("The letter A")
default:
println("Not the letter A")
}
break と continue
ループ文・switch
文にはbreak
とcontinue
が使えます。
面白いのはfallthrough
というのが明示できること。というか、break
がデフォルトの動作。fallthrough
を明示しない限り、次のcase
やdefault
は実行されません。
switch integer {
case 2,4,6,8:
description += "偶数で、"
fallthrough // 次の case もしくは default も実行
default:
description += "整数です。"
}
switch
文で次のcase
もそのまま実行する場合、C言語などではbreak
を置かないことで実現できて、意図的にそのようにする場合は慣例的にコメントしたりしていたと思います。
関数 (Functions)
func
基本形:
func functionName(parameter: #ParameterType) -> #ReturnType {
return #ReturnValue
}
Objective-C風:
func doSomething(withValue value1: #ValueType andValue value2: #ValueType) -> #ReturnType {
return #ReturnValue
}
doSomething(withValue:x andValue:y);
引数宣言に = 初期値
をつけると、引数のデフォルト値を指定できる。
引数に...
を使うと取る引数を可変長にできる (Variadic Paramater って言うんですね)。
func arithmeticMean(numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5) // 1 + 2 + 3 + 4 + 5
引数にinout
を指定すると、その引数に対して変数を参照渡しすることができる。
func check(inout a: Int inout b: Int) {
a = ..... // a の値を変える
b = ..... // b の値を変える
}
inout
を指定した引数に対しては、呼び出し元で&
を付けて参照渡しのような形にする。
check(&a,&b)
クロージャ
基本形:
{ (引数) -> 戻り型 in
実行
}
例えば
{ (s1: Int, s2: Int) -> Bool in
return s1 > s2
}
Objective-C の Block よりもわかりやすいかな?
ただ、括弧や型やreturn
を省略した書き方もあるようで、
{ s1, s2 in s1 > s2 }
は先のクロージャと同一の内容になるようです (先のクロージャと違って Double で動作するかもしれませんが)。
さらにさらに引数すら省略する書き方もあり、この場合は $0
、$1
、$2
のように $
+ 数字が引数として利用できます。
{ $0 > $1 }
は先のクロージャと同一の内容です。
関数を返す関数
func
には戻り値の型を指定することができます。
->
の後が戻り値になるので、それが () -> Bool
という形で記述すると関数を返すことを明示することになります。
この () -> Bool
は返す関数によって変わります。Int
を取って Int
を返す関数だと Int -> Int
という記述になるようです。
func getToggler() -> () -> Bool {
var value = true
func toggler() -> Bool {
value = !value
return value
}
return toggler // <= 関数を返している
}
返す関数の実体はクロージャの様子。参照されている変数などはスコープに応じてキャプチャされる模様。
構造体 (Structures)
列挙型 enum
Swiftのenum
はC言語のように整数で列挙するというものではないようです。
基本は列挙なんですが、アクセスする際に .
をつける必要があったり、型を指定したりすることができる感じ。
C言語のenum
というより、struct
に近い感じ。特殊なstruct
?
class と struct
Swiftにはclass
とstruct
があります。C++みたい。
- 変数を格納するプロパティを定義できる
- メソッドを定義できる
- 添字(subscripts)アクセス
[]
を定義できる - イニシャライザを定義できる
- デフォルトの実装を拡張できる
- プロトコルに適応した
class
/structure
を定義できる
は共通ですが、
- 継承を指定できるのは
class
だけ - インスタンスに対してタイプキャストができるのは
class
だけ - デイニシャライザが利用できるのは
class
だけ - リファレンスカウンタがひとつ以上のリファレンスに有効なのは
class
だけ -
struct
(とenum
)は常に値で渡される(Value Type)、class
は常に参照で渡される(Reference Type)
.... とりあえず、ざっくり。後日、追加するか、別途記事を書くかもしれません。
その2に続きます。