Swift入門メモ -列挙型-
15 列挙型
- あるデータが取り得る値を一覧にしたデータ型
- 1文字目は必ず大文字
// 1文字目は必ず大文字 enum Result { case Success case Error } var r: Result r = Result.Success // rがResult型というのはわかっているので型を省略して書くこともできる r = .Success
- 値を割り当てる
// Int型の値を割り当てる enum Result: Int { case Success = 0 case Error // 次にcase文が出てきたら値を1ずつ増やしてくれるので1になる } // Errorの値を取り出す Result.Error.rawValue // 1
- 関数を定義する
enum Result: Int { case Success = 0 case Error // String型を返す関数を定義 func getMessage() -> String { // self でデータが入ってくる switch self { case .Success: return "OK!!!" case .Error: return "NG!!" } } } // 関数を使う Result.Error.getMessage() // NG!!
Swift入門メモ -関数-
13,14 関数を使う
関数とは
- 複数の処理をまとめることができる
基本形
func sayHello() { println("Hello") } sayHello() // 関数呼び出し「Hello」と表示
引数
基本
func sayHello(name: String) { println(name + " say hello") } sayHello("プラニメ") // 「プラニメ say hello」と表示
引数を渡すときに明示的に何のデータか表示したい場合
// mynameが渡ってきた時にnameに対応させる func sayHello(myname name: String) { println(name + " say hello") // プラニメ say hello } sayHello(myname: "プラニメ") // 「プラニメ say hello」と表示
呼び出すときに渡すキーと関数内で使う変数名が一緒の場合
// 「#」をつけると同じ名前で渡されていると分かる func sayHello(#name: String) { println(name + " say hello") // プラニメ say hello } sayHello(name: "プラニメ")
引数の初期値
func sayHello(#name: String = "プラニメ") { println(name + " say hello") } sayHello() // 引数がない場合は初期値を表示 sayHello(name: "gawao") // gawao say hello
返り値
// 整数型の引数を2つ取り、整数型を1つ返す func sum(a:Int, b:Int) -> Int { return a + b } println(sum(5, 11)) // 16 // 複数の返り値->タプルが使える func swap(a: Int, b: Int) -> (Int, Int) { return (b, a) } println(swap(5, 11)) // (11, 5)
関数に渡した引数を書き換える
渡した値を書き換える
- 関数に値を渡すときは値のコピーが渡されていて、関数の中で処理されてもオリジナルの値が変わるわけではない
// 関数の中で値を変えているので、引数に「var」を付ける func f(var a:Int) { a = 20 // 関数の中では「20」 } var a = 5 f(a) a // 「5」のまま
- オリジナルの値を変える場合は
inout
を使う
func f(inout a:Int) { a = 20 } var a = 5 // 渡す時に「&」を付ける f(&a) a //「20」になる
Swift入門メモ -Optional-
12 Optional
Optional
ではない型はnil
になり得ない決まり- あるデータが
nil
かどうか曖昧なままだと重大なエラーが起きやすいという傾向があるため(※よくわかってない)
var s: String s = nil // エラーになる
nil
になり得る型をOptional
にしなくてはいけない
var s: String? // Optionalにする s = nil // エラーにならない
Optional
型の場合は値を取り出すときに!
を付ける!
を付けてOptional
型の値を取り出すことをUnwrapする
という
let name: String? = "gawao" // let msg = "hello " + name // エラーになる let msg = "hello " + name! // hello gawao
Unwrap
する際は、必ず値がnil
ではないことを最初に確認する
let name: String? = "gawao" // if文でチェック if name != nil { let msg = "hello " + name! } // よく使うやり方 // 一時的にsにnameの値を入れる // 値が入ったら条件が真になる // 中が実行される if let s = name { let msg = "hello " + s // 値が入るのはわかっているので「!」は不要 }
- 暗黙的に
Unwrap
されるOptional
型 - あるOptional型が
nil
になり得ないとわかっているときのみ使う - 初期化の時に一瞬
nil
になるが、そのあとは値をずっと保持するオブジェクトを扱う時に使ったり(※よくわかってない)
var label: String! label = "score" // すでにUnwrapされている println(label)
Optionalのところ殆ど理解してない。
アプリの開発をしていく過程で理解出来るか・・・
Swift入門メモ -while・do...while・for-
10 while,do…while
- ある条件を満たしている間処理を繰り返す
- whileは条件判定が前
- do…whileは条件判定が後なので、必ず1回実行される
// while var n = 0 while n < 10 { println(n) n++ }
// do…while var n = 20 do { println(n) // 必ず1回は実行されるので 20 と表示される n++ } while n < 10
11 for
- for文による繰り返し
// 0から9まで表示 for var i = 0; i < 10; i++ { println(i) }
- ループの途中で処理をスキップするときは
continue
(whileにも使える)
// ループの途中で処理をスキップ for var i = 0; i < 10; i++ { // 3は表示されない if i == 3 { continue } println(i) }
- ループの途中で処理を抜ける場合は
break
// ループの途中で処理を抜ける for var i = 0; i < 10; i++ { // 0,1,2を表示して処理終了 if i == 3 { break } println(i) }
- 範囲演算子を使う事も出来る
// 範囲演算子を使って0から9を表示 for i in 0...9 { println(i) }
- 配列、辞書型データでfor…in…を使う
// 配列 let a = [5, 3, 11] for i in a { // 5, 3, 11が表示されて終わる println(i) } // 辞書型 let d = ["yasumoto": 5, "kobayashi": 11] // key, valueをタプルで受け取る for (k, v) in d { println("key: \(k), value: \(v)") }
Swift入門メモ -if・switch-
08 ifで条件分岐
- 何らかの条件に応じて処理を振り分けたいとき
- 比較演算子を使う
> >= < <= == !=
let score = 62 var result = "" if score > 80 { result = "Great" } else if score > 60 { result = "Good" // ここ } else { result = "so so ..." } // 以下のifを三項演算子で書いてみる if score > 80 { result = "Great" } else { result = "so so ..." // ここ } result = score > 80 ? "Great" : "so so..." result // so so...
09 switchで条件分岐
- 何らかの条件に応じで処理を振り分けたいとき
- case文を区切るのに
break
は必要ない - 取り得る値が複数ある場合はカンマ区切り
- 範囲演算子を使うことが出来る
- 細かい条件の指定も可能
- 取り得る値をすべて網羅出来ない場合は、必ず
default
句が必要 - 何らかの時に何もしたくない場合は
break
と書く - 続けて次の処理もしておきたい場合は
fallthrough
let num = 8 switch num { case 1, 2, 4, 8: println("tenkou") fallthrough // 続けて次の処理をしたい場合 // num=1,2,4,8の場合は、"tenkou"の後に"mayama"と表示される case 3: println("mayama") case 5...7: // 範囲演算子:5, 6, 7 println("yasumoto, hirota, hoshina") case 9..<11: // 範囲演算子:9, 10(11は含まない) println("matsuno, kashiwagi") case let n where n > 10 && n < 13: // 一旦値がnに入り、where句で条件を指定して真の場合に続く処理が実行される println("kobayashi, nakayama") default: // println("n.a.") break // 何もしたくない場合はbreak }
Swift入門メモ -タプル・配列・辞書-
05 タプルを使ってみよう
- タプル->複数の値をまとめて渡すときによく使われる
// タプル let error = (404, "not found") error.0 // 404 error.1 // not found // 名前を付ける let error2 = (code: 404, msg: "not found") error2.0 // 404 error2.code // 404 error2.1 // not found error2.msg // not found
- タプルに対してタプルの値を渡す
let error = (404, "not found") let (code, msg) = error code // 404 msg // not found
- タプルに渡ってくる複数の値のうち、使わないものがある場合は
_
で値を安全に破棄することができる
let error = (404, "not found") let (code, _) = error // "not found"は使わない code // 404 //msg // エラーになる
06 配列を使ってみよう
配列とは
- 関連性のある複数のデータを1つの変数名でまとめて管理したい場合に使う
// 配列 String型のデータを入れる var students: [String] = ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"] // 値の取り出し/添字は0から students[0] // mayama students[1] // yasumoto // 値の変更 // ※ 「let students」 の場合は変更出来ない students[0] = "mizocchi" students // ["mizocchi", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"]
便利な命令
- 要素の個数を数える
count
- 配列が空かどうかを調べる
isEmpty
- 末尾に要素を追加
append
- 任意の位置に入れる
insert
- 削除
removeAtIndex
- 末尾を削除
removeLast
// 配列 String型のデータを入れる var students: [String] = ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"] students.count // 8 students.isEmpty // false // 末尾に追加 students.append("karisome") students // ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama", "karisome"] students.count // 9 // 任意の位置に追加 students.insert("mizuki", atIndex: 0) students // ["mizuki", "mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama", "karisome"] students.count // 10 // 任意の位置を削除 students.removeAtIndex(9) // karisome students // ["mizuki", "mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"] students.count // 9 // 末尾を削除 // 削除すると削除されたものが返される let lastsamurai = students.removeLast() // nakayama students // ["mizuki", "mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi"] students.count // 8 lastsamurai // nakayama // --------------元に戻す students.removeAtIndex(0) // mizuki (´;ω;`) students // ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi"] students.count // 7 students.append(lastsamurai) students // ["mayama", "yasumoto", "hirota", "hosina", "matuno", "kashiwagi", "kobayasi", "nakayama"] students.count // 8
空の配列
String型
の場合はvar emptyArray = [String]()
07 辞書を使ってみよう
辞書とは
- キーと値のペアでデータを管理
// キーをString型、値をInt型で管理 var students: [String: Int] = [ "mayama": 3, "yasumoto": 5, "hirota": 6, "hoshina": 7, "matsuno": 9, "kashiwagi": 10, "kobayashi": 11, "nakayama": 12 ] // 値の取り出し(「Some」はOptionalという考え方。後で) students["yasumoto"] // {Some 5}
便利な命令
- ペアの数
count
- 空かどうか
isEmpty
- 値の追加
新しいキーで値を指定
- 削除
removeValueForKey
- 値の更新
updateValue
かキーを指定して値を更新
- キーと値の一覧を配列か何かで取りたい
xxx.keys
xxx.values
students.count // 8 students.isEmpty //false // 値の追加 students["suzuki"] = 8 // 順番は保証されてないみたい students // ["hoshina": 7, "mayama": 3, "kashiwagi": 10, "nakayama": 12, "matsuno": 9, "hirota": 6, "suzuki": 8, "kobayashi": 11, "yasumoto": 5] // 値の削除 students.removeValueForKey("suzuki") // {Some 8} students // ["hoshina": 7, "mayama": 3, "kashiwagi": 10, "nakayama": 12, "matsuno": 9, "hirota": 6, "kobayashi": 11, "yasumoto": 5] // 値の更新 // 元の値が返り値として返ってくる let number = students.updateValue(1, forKey: "mayama") // {Some 3} // キーを指定して値を更新することも出来る // students["mayama"] = 1 // {Some 1} students // ["hoshina": 7, "mayama": 1, "kashiwagi": 10, "nakayama": 12, "matsuno": 9, "hirota": 6, "kobayashi": 11, "yasumoto": 5] number // {Some 3} // キーの一覧を配列で取得 let keys = Array(students.keys) keys // ["hoshina", "mayama", "kashiwagi", "nakayama", "matsuno", "hirota", "kobayashi", "yasumoto"] // 値の一覧を配列で取得 let values = Array(students.values) values // [7, 1, 10, 12, 9, 6, 11, 5]
空の辞書型
- キーが
String型
で値がInt型
の場合->var emptyDictionary = [String: Int]()
Swift入門メモ -基本データ型まで-
そろそろiPhoneアプリが作れるようになりたくて、Swiftの勉強をやっと開始。
いつもお世話になってるドットインストールでSwift入門があるとのことでプレミアム会員になりました。お金払いました。
以下はそのメモ。
(有料のものをブログに載せるってどうなんですかね。。メモ程度だったらいいのかな。。ほぼそのまま載せてるけど。。ダメだったら教えて下さい)
※3/26追記 ドットインストールのヘルプに明記されていましたので、各レッスンへのリンク追記しました
01 Swiftを使ってみよう
Swiftとは
公式サイト
ツール
02 はじめてのSwift
Playgroundの使い方
- 左側にコードを書くと、右側にそれが評価されて表示される
- 右側には2つアイコンがある
- 1つ目:Quick Look -> 簡単に値を表示するためのもの
- 2つ目:Value History -> 詳しい情報が出てくる(後々使う)
はじめてのSwiftプログラム
// println -> 改行付きで文字列を表示 // print -> 改行なしで文字列を表示 // 文字列は 「”」で囲む // 文末に「;」は付けない println("Hello Ebichu") // “Hello Ebichu” // 一行コメント /* 複数行コメント */
03 変数と定数を使う
変数
- 変数を使う前には宣言
var
キーワードを使うvar 変数名 : データ型
- 変数の宣言と代入は一度に出来る
// String型の変数msgを宣言 var msg: String // 変数msgに文字列を代入 msg = "Hello Ebichu!!" // 変数に代入した文字列を表示 println(msg) // —————————— // 変数の宣言と代入を一度に行う // String型であることがわかっているので型は不要 var msg2 = "Hello EBC"
定数
- 変更が出来ない変数
- 変更されると困る値や変更の予定がない値は定数にしていくと安全なプログラムが書ける
- 定数の宣言は
let
キーワードを使う
let s = "ebichu" println(s) // “ebichu” // 定数は変更出来ないので以下はエラーになる // s = "momoclo"
変数・定数の展開
- 文字列の中で展開して表示することが出来る
\(変数名)
var msg: String msg = "Hello Ebichu" let s = "ebichu" println(s) println("msg: \(msg), s: \(s)") // msg: Hello Ebichu, s: ebichu
- 展開する変数の型はString以外でもOK
let msg = "Golden" let num = 8 println("We are \(msg) \(num) !!") // We are Golden 8 !!
04 基本データ型を見ていこう
基本データ型
- 文字列
String
“hoge”
- 整数
Int
5572320
- 小数点を含む数値
Float/Double
3.14159265358979
Float/Double
の違いは精度。Double
の方が精度が高い
- 論理演算
Bool
true/false
- 何もないという意味での
nil
演算
- 四則演算
+ - * / %
- 単項演算子
++
—
- 前につける
++x
、後ろにつけるx++
- 前と後ろで評価の順番が変わる
- 前につける
- 文字列の連結は
+
let s = “hello” + “world”
->helloworld
- 論理演算
&& || !
true && false
->false
true || false
->true
!true
->false
- データ型を変換するconversion
// conversion let a = "hkt" let b = 48 // 以下はエラー。文字列型と数値型を連結しようとしているから // let c = a + b // 48を文字列型にする let c = a + String(b) // hkt48