Xcode
iOS
apple
Swift

【Swift】Optionalな要素を持つArrayをループでunwrapして使う

More than 1 year has passed since last update.

はじめに

次のような、Optionalで包まれた要素をもつArrayがあるとします。
このArrayに対して、ループの中でnilでない要素をunwrapして処理を実行する状況を考えます。

let items: [Int?] = [1, 3, nil, 6, 10, nil, nil, 8]

このような処理の書き方を、初めて知ったやり方もあったので、4種類ほど紹介してみます。
4種類とも処理の結果は同じになります。

実行したSwiftバージョン

  • Swift3.1

書き方

▼ 単純なループ

ループしながらguardでnilを弾いてみます

for i in items {
    guard let item = i else {
        continue
    }
    print(item)
}

// ↓出力結果
// 1
// 3
// 6
// 10
// 8

▼ Enumeration Case Pattern

Enumeration Case Pattern によるパターンマッチング

for case .some(let item) in items {
    print(item)
}

// ↓出力結果
// 1
// 3
// 6
// 10
// 8

▼ Optional Pattern

Optional Pattern によるパターンマッチング

for case let item? in items {
    print(item)
}

// ↓出力結果
// 1
// 3
// 6
// 10
// 8

▼ Functional

関数型で書いてみます

items.flatMap({ $0 }).forEach({ print($0) })

// ↓出力結果
// 1
// 3
// 6
// 10
// 8

おわりに

きっと他にもいろんな書き方ができるんだろうな〜と思います。
間違いなどありましたらご指摘ください:bow_tone1:

参考

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/swift/grammar/optional-pattern