LoginSignup
256
253

More than 5 years have passed since last update.

Swiftに関するメモ

Last updated at Posted at 2014-06-02

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 ループ

forin で要素をイテレーションできる。

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文にはbreakcontinueが使えます。

面白いのはfallthroughというのが明示できること。というか、breakがデフォルトの動作。fallthroughを明示しない限り、次のcasedefaultは実行されません。

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にはclassstructがあります。C++みたい。

  • 変数を格納するプロパティを定義できる
  • メソッドを定義できる
  • 添字(subscripts)アクセス [] を定義できる
  • イニシャライザを定義できる
  • デフォルトの実装を拡張できる
  • プロトコルに適応したclass/structureを定義できる

は共通ですが、

  • 継承を指定できるのはclassだけ
  • インスタンスに対してタイプキャストができるのはclassだけ
  • デイニシャライザが利用できるのはclassだけ
  • リファレンスカウンタがひとつ以上のリファレンスに有効なのはclassだけ
  • struct(とenum)は常に値で渡される(Value Type)、classは常に参照で渡される(Reference Type)

.... とりあえず、ざっくり。後日、追加するか、別途記事を書くかもしれません。

その2に続きます。

256
253
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
256
253