個人用Swiftまとめ

# はじめに
この記事は、[初心者のためのSwiftで始めるプログラミング入門](http://www.atmarkit.co.jp/ait/series/1774)や[初心者のためのSwiftプログラミング入門](http://libro.tuyano.com/index2?id=10206003)をベースに、僕個人（一応Pythonista)がSwiftを始めるにあたってまとめたメモです。
随時更新しています。

# 文法
## 変数
```swift
var hoge = "hoge"
// 明示的に型を指定
var baz: Int = 12345
```
## 定数
```swift
let foo = "bar"
```
## typeformatter
```swift
let price = 100
println("イチゴは\(price)円です") // -> イチゴは100円です
```
## 基本型
String, Int, Bool, Double, Floatとか

## 組み合わせ演算子
```swift
// +=, -=, /=, *=などは利用可能
```

## 演算子オーバーロード
```swift
let 名前 = "Swift太郎"
println("私は" + 名前 + "です")
```

## if-else文
```swift
let ナスの値段 = 100
if ナスの値段 <= 300 {
    println("ナスは300円以下")
} else if ナスの値段 <= 200 {
    println("ナスは200円以下")
} else if ナスの値段 <= 100 {
    println("ナスは100円以下")
} else {
    println("ナスは301円以上")
}
```

## switch文
```swift
let 松茸 = 8000
switch 松茸 {
case 0:
    println("松茸はタダ")
case 1...10000:
    println("松茸は10,000円以下")
case 100000, 1000000:
    println("松茸がすごい高くてしかもキリ番")
default:
    println("高級な松茸")
}
```
- breakはいらない
- ,で複数の値を設定可能
- ...で範囲指定が可能

## for文、while文
```swift
// for
var 値段 = 100
for 回数 in 1...10 {
    値段 *= 2
}
println("最終的な値段は\(値段)円")
 
// for-2 -> Pythonみたい！
for トップス in クローゼット {
   println("\(トップス)を取り出しました")
}

// while
var 枚数 = 0
while 枚数 < 10 {
    枚数 += 1
    println("\(枚数)皿目")
}
println("お寿司を\(枚数)皿食べた")
```

## コレクション系
配列、辞書、セットがある

```swift
// 配列
// 二つは一緒
var arr1 = [Int](count:10, repeatedValue:0)
var arr2 = [0,0,0,0,0,0,0,0,0,0]
```
配列の基本操作→http://libro.tuyano.com/index3?id=5226003&page=3
辞書の基本操作→http://libro.tuyano.com/index3?id=5226003&page=5



# 関数

```swift
// Intを受け取ってIntを返す
func plusTwo(x: Int) -> Int {
    return x + 2
}

// 外部名を設定する
// [外部名 内部名: 型]という形で宣言する
func plusTwoNumAndPlusTwo(num1 x: Int, num2 y: Int) -> Int {
   return x + y + 2;
}

plusTwoNumAndPlusTwo(num1:10, num2:20) // = 32

// ショートハンド
// 外部名=内部名
func plusTwoNumAndPlusTwo(#x: Int, #y: Int) -> Int {
   return x + y + 2;
}

plusTwoNumAndPlusTwo(x:10, y:20) // = 32

//　デフォルト値の設定も可能
func tax(#price: Int, rate: Double = 0.08) -> Int {
  return Int(Double(price) * (1.0 + rate))
}

// 複数の値を返せる
func plusTwoAndHokuto(x: Int, y: String) -> (Int, String) {
    return (plusTwo(x), y + "Hokuto")
}

// クロージャ
let plusTwoClosure : Int -> Int = {x in x + 2}

// 関数の引数に関数を渡す
func calc(arg: Int, f: Int -> Int) -> Int {
  return f(arg)
}

calc(100, plusTwoClosure) // = 102
1
// 関数の返り値を関数にする
func add(x: Int) -> Int -> Int {
  func addX(y: Int) -> Int {
    return x + y
  }
  return addX
}
 
let add10 = add(10)
 
add10(5) // = 15

// カリー化
func add(x: Int)(y: Int) -> Int {
  return x + y
}

let add10 = add(10)

add10(5) // = 15

// 可変引数
func allAdd(#nums: Int...) -> {
  var total = 0
  forn in nums {
    total += num
  }
  return total
}

// INOUTキーワード
// 参照渡し的なこと
func tax(inout price:Int, rate:Double = 0.08) -> Void {
    price = Int(Double(price) * (1.0 + rate))
}
 
var num = 12300
tax(&num) // num == 12300 * 1.08




```
# クラス
一般的な言語との差異のみ
## Computedプロパティ
getのみにすると変更不可になる

```swift
class Friend {
    var name:String
     
    var old:Int
     
    var age:Int {
        get {
            return old
        }
        set {
            if newValue > 0 {
                old = newValue
            }
        }
    }
     
    init(name:String, age:Int) {
        self.name = name
        self.old = age
    }
     
    func printData() {
        println("\(self.name) (\(age))")
    }
}
 
var you = Friend(name: "Taro", age: 30)
you.printData()
```

## クラス変数・クラスメソッド
頭にclassをつける

# 構造体
クラスと似ているが、イニシャライザ自動生成、継承できない、参照ではないなどの特徴がある

# protocolとextensiton

## protocol
Javaでいうところのインタフェースかな？


```swift
protocol MyProtocol {
    func printData ()
}
 
class PersonData: MyProtocol {
    var name:String = ""
     
    init(name:String) {
        self.name = name
    }
     
    func printData() {
        println("[name: \(name).]")
    }
}
 
class MemoData: MyProtocol {
    var content:String = ""
     
    init(content:String) {
        self.content = content
    }
     
    func printData() {
        println(content)
    }
}
 
var data:[MyProtocol] = []
data.append(PersonData(name: "山田太郎"))
data.append(MemoData(content: "明日９時から会議"))
for obj in data {
    obj.printData()
}
```

## extension
あとづけ可能

```swift
extension Int {
    func getTotal()->Int {
        var total:Int = 0
        for i in 1...self {
            total += i
        }
        return total
    }
}
 
var num = 1234
println(num.getTotal())