Swift の Array
ちょっとしたロジックをシンプルに実装したいと思い、Arrayのドキュメントを見直したらいろいろ発見がありました。
https://developer.apple.com/documentation/swift/array(英文)
項目は細分されていてたくさんありますがひとつひとつは明快で、適切なサンプルが載っているものも多いので気軽に見てみてください。
例によって Safari の翻訳機能を使えば、ほぼ実用的な日本語表示となります。
段落単位で原文が表示されることがありますが、選択してその部分をコンテキストメニューの「翻訳」機能で翻訳できます。
翻訳が不要の場合は Xcode のドキュメント表示でも同じです。
サンプルコード部分もコピー可能です。
isEmpty や append(_:) や last などは常用していますが、ドキュメントを見ないと思い出せないものもたくさんあります。
以下ドキュメントからピックアップしたものです。
サンプルコードもドキュメントに載っているものそのままです。
init(_:)
イニシャライザーは複数ありますが、これは
init<S>(_ s: S) where Element == S.Element, S : Sequence です。
要素の数が増えるほど効果があります。
let numbers = Array(1...7)
print(numbers)
// Prints "[1, 2, 3, 4, 5, 6, 7]"
init(repeating:count:)
同じ要素を指定回数繰り返すイニシャライザーです。
let fiveZs = Array(repeating: "Z", count: 5)
print(fiveZs)
// Prints "["Z", "Z", "Z", "Z", "Z"]"
subscript(_:)
streets[2 ..< streets.endIndex] のように Rangeで指定する subscript です。
let streets = ["Adams", "Bryant", "Channing", "Douglas", "Evarts"]
let streetsSlice = streets[2 ..< streets.endIndex]
print(streetsSlice)
// Prints "["Channing", "Douglas", "Evarts"]"
let i = streetsSlice.firstIndex(of: "Evarts") // 4
print(streets[i!])
// Prints "Evarts"
randomElement()
ランダムな要素を返します。
ただし func randomElement() -> Self.Element? とオプショナルを返します。
let names = ["Zoey", "Chloe", "Amani", "Amaia"]
let randomName = names.randomElement()!
// randomName == "Amani"
append(contentsOf:)
配列の末尾にシーケンスの要素を追加します。
var numbers = [1, 2, 3, 4, 5]
numbers.append(contentsOf: 10...15)
print(numbers)
// Prints "[1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]"
removeAll(where:)
指定した条件の要素をすべて削除します。
var phrase = "The rain in Spain stays mainly in the plain."
let vowels: Set<Character> = ["a", "e", "i", "o", "u"]
phrase.removeAll(where: { vowels.contains($0) })
// phrase == "Th rn n Spn stys mnly n th pln."
popLast()
コレクションの最後の要素を削除して返します。
最後を削除するだけでなく、その要素を返すメソッドです。
ただし mutating func popLast() -> Self.Element? とオプショナルを返します。
contains(_:)
指定要素を含むなら true を返します。
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
print(cast.contains("Marlon"))
// Prints "true"
print(cast.contains("James"))
// Prints "false"
contains(where:)
条件を満たす要素を含むなら true を返します。
let expenses = [21.37, 55.21, 9.32, 10.18, 388.77, 11.41]
let hasBigPurchase = expenses.contains { $0 > 100 }
// 'hasBigPurchase' == true
このサンプルはトレイリングクロージャーで条件を記述しているので where: は省略されています。
let hasBigPurchase = expenses.contains(where: { $0 > 100 } ) と同じです。
サンプルを確認するには Playground(s) が便利です。
ほかにもいろいろあります。
forループを作らなくても可能な処理を活用すると、シンプルで読みやすいコード(Swiftらしいコード)になりますね。
とにかくたくさんあるので、ドキュメントを見よう!