イッツァハローワールド

恥さらしていこうかなとか。

swift1日目

今までswiftから逃げまわってきた人ですが、
先日先輩からswiftの書籍をもらったので、勉強メモ。


C言語わかる、Obj-Cもかじっている程度なら全然分かるメモかと思います。

swiftやる前にPlayground

その名の通り、swiftプログラムの遊び場、実験場。
テキストエディタswiftコードを書くと実行結果を表示する。
Xcodeにあるの知らなかったぜ...

Playgroundファイル作成

[File]→[New]→[Playground...]でつくる。

変数宣言

var 変数:
// 例
var num: Int
num = 3

// 初期化
var num2: Int = 0

// 型推論
var num3 = 0.5 // 少数で初期化しているからDoubleと推論

慣れない('A`)
まずここから慣れるの時間かかるな...

定数宣言

let 定数:=

定数は初期値が必要

// 定数宣言
let pi = 3.141592 //OK
pi = 3.1 //エラー(変数ちゃうで)
let root2: Double //エラー(初期値ないよ)

文字列

// 文字列
var emptyString = String()  // 空文字

var num1 = 1
var calcString = "1 + 1 = \(num1 + num1)"   // 文字列補間

文字コード→文字をつくる

// 「\u{文字コード}」で記述
let faceChar = "\u{1f617}"  // 😗

letで宣言すればNSString, varで宣言すればNSMutableString

なるほど。わかりやすい。

配列

// 配列
var year = [2010, 2011, 2012, 2013, 2014, 2015]

// 配列の型を明示的にする
// var 変数名:[型] = [要素, 要素, 要素]
var 都道府県:[String] = ["東京都", "京都府", "沖縄県"]

//空配列 (どの書き方でもいいよ)
var emptyArray = [String]()

var emptyArray2: [String] = Array()

// 配列の型推論
var emptyArray3 = []

辞書

// 辞書
var address = ["都道府県" : "東京都", "市区町村" : "渋谷区"]
// キー指定で値を引っ張る
var prefecture = address["都道府県"]

// 辞書の明示的型宣言
// var 変数名 = Dictionary<キーの型, 値の型>()
var emptyDict2 = Dictionary<String, String>()
// var 変数名 = [ キーの型 : 値の型 ]
var emptyDict3 = [Int:String]()

// 辞書の型推論
var emptyDict4 = [:]

NSArray と NSDictionary

  • NSArray ≠ Array
  • NSDictionary ≠ Dictionary
import Foundation

// Swiftの辞書作成
var dict = ["key": "value"]

// NSDictionary型の辞書として生成
var nsdict = dict as NSDictionary

関数

/*
func 関数名(引数名:引数型) -> 戻り値型 {
    処理
    return 戻り値
}
*/
func func1(x: Int) -> Int {
    return x + 7
}

func1(3) // 10
func1(2) // 9

クロージャ

ああ、Blocksのことですか。

/*
クロージャ
{ (引数名, ...) -> 戻り値型 in
    // 処理
    // return 戻り値
}
*/
// hoge関数の定義
func hoge(handler:(String, String, String) -> Int) {
    var hoge1 = "hage1"
    var hoge2 = "hage2"
    var hoge3 = "hage3"
    
    handler(hoge1, hoge2, hoge3)
    
}

// hoge関数を呼び出す
hoge({(hoge1 ,hoge2, hoge3) -> Int in
    println(hoge1)
    return 0
})

上記の例文でやっていることは

  1. hoge関数を呼び出す(引数にクロージャ
  2. hoge関数で定義したhoge1〜3をクロージャに渡す
  3. クロージャはhage1を出力, 0を返す

クラスと構造体の使い分け

  • 大量にインスタンスを確保、破棄するもの → 構造体
  • たくさんの情報を持っている、ライフタイムが長いもの → クラス

理由

構造体の方がクラスより軽量
  • インスタンスの確保、破棄に関する手間が少ない
  • メモリ量が少ない
構造体はARCが効かない

プロパティ

保持プロパティ

クラス、構造体の中で変数の形で宣言されているもの。
よく見てきたプロパティ。

算出プロパティ

変数を持たず、プロパティにアクセスするメソッドを用意して計算を行うもの。¥

struct Rect {
    // 保持プロパティ
    var x: Float = 0
    var y: Float = 0
    var width: Float = 0
    var height: Float = 0

    // 算出プロパティ
    var centerX: Float {
        get {
            return x + width * 0.5
        }
        set (centerX) {
            x = centerX - width * 0.5
        }
    }
}

プロパティ変更時に別のプロパティも変わらないといけない場合は、算出プロパティにしておけばいちいち全てのプロパティの変更処理書かなくていいから楽ね。

メソッド

タイプメソッド

Obj-Cでいうクラスメソッドのことかな。

  • 構造体のタイプメソッドはfuncの前に "static" をつける
  • クラスのタイプメソッドはfuncの前に "class" をつける

インスタンスメソッド

Obj-Cのインスタンスメソッドと同じイメージ

Optional型

  • Optional 型 : nil の代入を許す
  • 非 optional 型 : nil の代入を許さない

Any

なんでも指定できる。Any型の配列ならなんの型でもオーライ

    var anyArray = [Any]()
    anyArray.append(0)    // 整数
    anyArray.append(1.234)    // 小数
    anyArray.append("hoge")    // 文字列

AnyObject

id型とおんなじイメージ

ラップやらアンラップやら

  • ラップされてる状態 → オブジェクトが、正当なものかもしれないし、nilかもしれない状態。
  • アンラップする → どんなオブジェクト化を確定する。

ここは、もうちょっと勉強してからメモろう。

MetaType

オブジェクトの型

objective-cではオブジェクトのクラス名欲しい時に

Class objectType = [SomeClass class];  

ってやってたけど、swiftでは

var objectType = SomeClass.self

らしい。
http://freecake.yayuhh.com/simple-reflection-in-swift/

感想

('A`)慣れねえ。(2回目)

Playgroundで試しながらの勉強なんで、理解度はいつもより早いんだけどね。
実際にサンプルプログラム書きがてら学ぼう...