Swift入門メモ -列挙型-

15 列挙型

dotinstall.com

  • あるデータが取り得る値を一覧にしたデータ型
  • 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 関数を使う

dotinstall.com

dotinstall.com

関数とは

  • 複数の処理をまとめることができる

基本形

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

dotinstall.com

  • 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

dotinstall.com

  • ある条件を満たしている間処理を繰り返す
  • 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

dotinstall.com

  • 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で条件分岐

dotinstall.com

  • 何らかの条件に応じて処理を振り分けたいとき
  • 比較演算子を使う > >= < <= == !=
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で条件分岐

dotinstall.com

  • 何らかの条件に応じで処理を振り分けたいとき
  • 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, 1011は含まない)
    println("matsuno, kashiwagi")
case let n where n > 10 && n < 13: // 一旦値がnに入り、where句で条件を指定して真の場合に続く処理が実行される
    println("kobayashi, nakayama")
default:
    // println("n.a.")
    break // 何もしたくない場合はbreak
}

Swift入門メモ -タプル・配列・辞書-

05 タプルを使ってみよう

dotinstall.com

  • タプル->複数の値をまとめて渡すときによく使われる
// タプル
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 配列を使ってみよう

dotinstall.com

配列とは

  • 関連性のある複数のデータを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 辞書を使ってみよう

dotinstall.com

辞書とは

  • キーと値のペアでデータを管理
// キーを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を使ってみよう

dotinstall.com

Swiftとは

公式サイト

ツール

  • Xcode 6以上
  • Swiftを試したいだけだったら、playgroundで出来る

02 はじめてのSwift

dotinstall.com

Playgroundの使い方

  • 左側にコードを書くと、右側にそれが評価されて表示される
  • 右側には2つアイコンがある
    • 1つ目:Quick Look -> 簡単に値を表示するためのもの
    • 2つ目:Value History -> 詳しい情報が出てくる(後々使う)

はじめてのSwiftプログラム

// println -> 改行付きで文字列を表示
// print -> 改行なしで文字列を表示
// 文字列は 「”」で囲む
// 文末に「;」は付けない
println("Hello Ebichu") // “Hello Ebichu”

// 一行コメント
/* 
複数行コメント
*/

03 変数と定数を使う

dotinstall.com

変数

  • 変数を使う前には宣言
  • 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 基本データ型を見ていこう

dotinstall.com

基本データ型

  • 文字列 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