Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

Organization

Swift入門 #2

記念すべき第2回です
やはり、いつもと違う言語の仕様を学ぶと、「その機能欲しい」「その機能をこっちの言語で実装できないか」など考えられるので良いと思い、続けます☺️

参考資料:改訂新版Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus) | 石川 洋資, 西山 勇世 |本 | 通販 | Amazon

条件分岐

条件により分岐をしていく方法ですね

if文

let bool: Bool = true
if bool {
} else {
}
let i: Int = 1
if i <= 0 {
} else if i < 3 {
    // ここに入る
} else {
}

上のiの判定をしたい場合、caseを使って簡単に書くこともできます

if case 1..<3 = i {
    // 1 <= i < 3
}

switch文

enum Hair {
    case short
    case medium
    case long
}

let hair = Hair.short
switch hair {
case .short, .medium:
    print(hair)
case .long:
    print(hair)
}

swiftのswitch文はbreakを書かなくてもbreakを実行してくれます。でも、caseの内容がなにもないときはbreakを明示的に書かなければなりません。
複数のcaseを定義したい場合は、,で区切ります。

let i: Int = 1
switch i {
case 0..<2:
    print(i)
case 3..<Int.max:
    print(i)
default:
    print(i)
}

このように範囲を指定して分岐させることもできます。先ほどは、すべての条件を網羅していたのでdefaultが必要なかったのですが、今回は負の値の場合の条件が足りないためdefaultが必要です。
この網羅性のチェックもコンパイルエラーとして表示してくれます。

let i: Int = 4
switch i {
case 0..<10 where i % 2 == 0:
    print(i)
default:
    break
}

caseは0<=i<10の範囲のパターンかどうかで分岐します。そこにwhereで条件式を追加することができます。
今回は、0<=i<10の範囲内かつ偶数の場合、print()が実行されます。

列挙型

先ほど出てきた列挙型enumです。

enum Hair {
    case short
    case medium
    case long
}

hashValue

let hair = Hair.long.hashValue // 2

標準で使えるプロパティです。1つ目のcaseから0で始まり順番になります。

rawValue

それぞれのcaseに対応した値を定義できます。

enum Hair: String {
    case short = "短い"
    case medium = "中くらい"
    case long = "長い"
}

let hair = Hair.long.rawValue // 長い

Int・String・Double・Characterなどの型が使用できます。

enum Hair: String {
    case short
    case medium
    case long
}

let hair = Hair.long.rawValue // long

IntとStringにはdefaultのrawValueが定義されています。
Int: hashValueと一緒で0から順番
String: caseの名前をそのまま文字列にする

メソッド

enum Hair: String {
    case short
    case medium
    case long

    init?(rawValue: String) {
        switch rawValue {
        case "short":
            self = .short
        case "medium":
            self = .medium
        case "long":
            self = .long
        default:
            return nil
        }
    }

    func getlength() -> Int {
        switch self {
        case .short:
            return 10
        case .medium:
            return 20
        case .long:
            return 30
        }
    }
}

let hair = Hair(rawValue: "short") // short
let length = hair?.getlength() // 10

初期化も書くことができます。init?は初期化に失敗した時にnilを返します。
またメソッドを追加することもできます。switchに自分自身のselfを渡して分岐させることもできます。

プロパティ

enum Hair: String {
    case short
    case medium
    case long

// ストアドプロパティ
//  let name = ""

// コンピューテッドプロパティ
    var name: String {
        switch self {
        case .short:
            return ""
        case .medium:
            return ""
        case .long:
            return ""
        }
    }
}

ストアドプロパティは持つことができません。ストアドプロパティは、値を保持するプロパティです。
コンピューテッドプロパティは持つことができます。コンピューテッドプロパティは値を保持せず算出するプロパティです。

連想値

enumのcaseそれぞれに値を持たせることができます。

enum Result<T> {
    case Success(T)
    case Error(Error)
}

RxSwiftでも使われているResult型です。非同期の結果をハンドリングする時とかに役立ちます。

enum MyError: Error {
    case LTE
    case WIFI
}

func some(bool: Bool) -> Result<Int> {
    if bool {
        return .Success(10)
    } else {
        return .Error(MyError.LTE)
    }
}

Errorもenumで定義できます。

let result = some(bool: true)
switch result {
case .Success(let value):
    print(value) // 10
case .Error(let error):
    print(error) // LTE
}

結果はこのようにハンドリングできます。今回はError呼ばれませんが、呼ばれた場合は、LTEがerror変数に入ります。

ジェネリクス・列挙型・列挙型.連想値・switchの組み合わせでこのようなことができます。組み合わせでできることを考えていくのもswiftの面白いところです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
2
Help us understand the problem. What are the problem?