Nakajijapan

生きるのに必死です。

Swift勉強会をした

社内で早速Swift勉強会を開きました。 流れとしては、あのときの動画(クレイグがSwiftを発表したところ)をみんなで10分程鑑賞してテンションあげてから公式のドキュメントを見ながら、みんなでぺちゃくちゃ話す会をしました。

はじめに

以下の動画をみてまずざっくりどんなものか概要をつかむ

https://developer.apple.com/videos/wwdc/2014/?id=101

A Swift Tour

About Swift

  • Objective-C without the C
  • iOSとOS Xで開発するための開発言語
  • Ccoa and Cocoa Touch
  • Build with LLVM compiler
  • Optimizer and Autovectorizer
  • ARC memory management
  • Same runtime as Objective-C

Simple Value

  • let,varで宣言
  • letは定数、varは変数
1
2
var foo = 33
let foo = 33
  • 格納する値が明白であれば自動できに方が決定される
  • 十分でなければ明示的に指定することも可能
1
2
3
let total = 30
let total = 30.0
let total:Double = 0
  • 初期化に以下のような宣言ができる
1
2
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
  • 単純な初期化は[] and [:]で省略できる
1
2
3

let emptyArray = []
let emptyDictionary = [:]

Control Flow

  • どこかでみたような記述でif,switch,for-in,for,while,do-whileできるよ
  • ..で数値の範囲を決定できることができる
1
2
3
4
5
6
var total = 0;
for i in 0..10 {
    total += 2
}

total

Functions and Closures

  • 考え方は他の言語と同じ。引数があって返り値がある
1
2
3
4
5
func greet(name: String, day: String) -> String {
  return "Hello \(name), today is \(day)"
}

greet("Bob", "Tuesday")
  • Touple
    • 複数の返り値を返す
1
2
3
4
func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
getGasPrices()
  • 引数を任意で指定することもできます
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func sumOf(numbers:Int...) -> Int
{
    var sum = 0
    for number in numbers {
        sum += number
    }

    return sum
}


sumOf()

sumOf(10, 20, 33)
  • {}でクロージャを記述
1
2
3
4
5
numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})

以下の記述も同じ意味

1
numbers.map({ number in 3 * number })

Objects and Classes

  • classで定義
  • init()はコンストラクタ

継承は

1
2
3
class Squre : NamedShape {

}

overrideはfuncの前にoverrideを宣言する

1
2
3
override func init() {
    super.init()
}

インスタンス変数をカスタマイズできる

1
2
3
4
5
6
7
8
9
var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

  • メンバ変数に以下の記述,willSet,didSetをすることであらかじめ、前処理後処理ができるようになる
1
2
3
4
5
6
7
8
9
10
11
class {
    var triangle: EquilateralTriangle {
    willSet {
        square.sideLength = newValue.sideLength
    }
    didSet {
        square.sideLength *= 2
    }
    }

}
  • 引数に別名を持たせられる
1
2
3
4
5
6
7
8
class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes times: Int) {
        count += amount * times
    }
}
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)

Enumerations and Structures

  • メソッドも作成できる
  • 最初に数値を入れておかなければならない
  • 後はインクリメントされる
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.toRaw())
        }
    }
}

let ace = Rank.Ace
let aceRawValue = ace.toRaw() # 1
let name = ace.simpleDescription() # "Ace"

enumの方で比較しないとだめ

1
2
3
4
5
6
7
8
9

        if ace == Rank.Ace {
            NSLog("-- ace!!!")
        }
// NG
//        else if ace == 1 {
//            NSLog("-- no ace...")
//        }

structure
  • classとほぼ同じ振る舞いをする
  • 処理するときは必ずコピーされる, クラスは参照によって処理される

Protocols and Extensions

  • 基本的なところはObjective-Cと変わらない
1
2
3
4
protocol ExampleProtocol {
    var simpleDescription: String { get } # readonly
    mutating func adjust()
}
  • クラスにも構造体にも組み込める
1
2
3
4
5
class SimpleClass: ExampleProtocol {
}

struct SimpleStructure: ExampleProtocol {
}

Generics

  • 型に汎用性を持たせて同じロジックを処理させることができる
  • classes, enumerations, structuresで利用できる
1
2
3
4
5
6
7
8
9
10
11
func repeat<T>(item: T, times: Int) -> T[] {
    var result = T[]()
    for i in 0..times {
        result += item
    }
    return result
}


repeat("knock", 4)
repeat(333, 3)

まとめ

何よりシンプルでモダンな作りになっているのでアプリを作ることがよりいっそう楽しくなること間違い無しですな。 ただ、いくつか説明できないところがあったので、次の会まで宿題にすることにします。