LoginSignup
1
2

More than 1 year has passed since last update.

【Swift】Arrayの操作方法をまとめてみた

Posted at

はじめに

Arrayから要素を追加・削除・取得する場合に、もっと簡単にできる方法があるのでは?と思うことがよくあるので、ドキュメントを確認しながら追加・削除・取得用途のものを一部まとめてみました。

要素の追加

func append(Element)
:要素を追加
var numbers = [1, 2, 3, 4, 5]
numbers.append(100)
print(numbers)
// Prints "[1, 2, 3, 4, 5, 100]"
func insert(Element, at: Int) 
:指定した位置に要素を追加
var numbers = [1, 2, 3, 4, 5]
numbers.insert(100, at: 3)
numbers.insert(200, at: numbers.endIndex)

print(numbers)
// Prints "[1, 2, 3, 100, 4, 5, 200]"

要素の削除

func remove(at: Int) -> Element
:指定した位置の要素を削除
var measurements: [Double] = [1.1, 1.5, 2.9, 1.2, 1.5, 1.3, 1.2]
let removed = measurements.remove(at: 2)
print(measurements)
// Prints "[1.1, 1.5, 1.2, 1.5, 1.3, 1.2]"
func removeFirst() -> Element
:最初の要素を削除
var bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
bugs.removeFirst()
print(bugs)
// Prints "["Bumblebee", "Cicada", "Damselfly", "Earwig"]"
func removeLast() -> Element
:最後の要素を削除
var bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
bugs.removeLast()
print(bugs)
// Prints "["Aphid", "Bumblebee", "Cicada", "Damselfly"]"
func removeFirst(Int)
:指定した数の要素を最初から削除
var bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
bugs.removeFirst(3)
print(bugs)
// Prints "["Damselfly", "Earwig"]"
func removeLast(Int)
:指定した数の要素を最後から削除
var bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
bugs.removeLast(3)
print(bugs)
// Prints "["Aphid", "Bumblebee"]"
func removeSubrange(Range<Int>)
:指定した範囲の要素を削除
var measurements = [1.2, 1.5, 2.9, 1.2, 1.5]
measurements.removeSubrange(1..<4)
print(measurements)
// Prints "[1.2, 1.5]"
func removeAll(where: (Element) -> Bool)
:条件に合った要素を全て削除
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."
func popLast() -> Element?
:最後の要素を削除&削除した要素の取得
var bugs = ["Aphid", "Bumblebee", "Cicada", "Damselfly", "Earwig"]
print(bugs.popLast())
print(bugs)

// Prints "Earwig"
// Prints "["Aphid", "Bumblebee", "Cicada", "Damselfly"]"

要素の取得

var first: Element?
:最初の要素を取得
let numbers = [10, 20, 30, 40, 50]
if let firstNumber = numbers.first {
    print(firstNumber)
}
// Prints "10"
var last: Element?
:最後の要素を取得
let numbers = [10, 20, 30, 40, 50]
if let lastNumber = numbers.last {
    print(lastNumber)
}
// Prints "50"
func randomElement() -> Element?
:ランダムな要素を取得
let names = ["Zoey", "Chloe", "Amani", "Amaia"]
let randomName = names.randomElement()!
// randomName == "Amani"
func contains(_ element: Element) -> Bool(Equatableの場合のみ)
:要素が含まれるかどうか(Equatable)
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
print(cast.contains("Marlon"))
// Prints "true"
print(cast.contains("James"))
// Prints "false"
func firstIndex(of: Element) -> Int?(Equatableの場合のみ)
:要素が含まれる最初のIndexを取得(Equatable)
var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.firstIndex(of: "Maxime") {
    students[i] = "Max"
}
print(students)
// Prints "["Ben", "Ivy", "Jordell", "Max"]"
func lastIndex(of: Element) -> Int?(Equatableの場合のみ)
:要素が含まれる最後のIndexを取得(Equatable)
var students = ["Ben", "Ivy", "Jordell", "Ben", "Maxime"]
if let i = students.lastIndex(of: "Ben") {
    students[i] = "Benjamin"
}
print(students)
// Prints "["Ben", "Ivy", "Jordell", "Benjamin", "Max"]"
func min() -> Element?(Comparableの場合のみ)
:最小値を取得(Comparable)
let heights = [67.5, 65.7, 64.3, 61.1, 58.5, 60.3, 64.9]
let lowestHeight = heights.min()
print(lowestHeight)
// Prints "Optional(58.5)"
func max() -> Element?(Comparableの場合のみ)
:最大値を取得(Comparable)
let heights = [67.5, 65.7, 64.3, 61.1, 58.5, 60.3, 64.9]
let greatestHeight = heights.max()
print(greatestHeight)
// Prints "Optional(67.5)"
func prefix(Int) -> ArraySlice<Element>
:指定した数の要素を先頭から全て(配列)取得
let numbers = [1, 2, 3, 4, 5]
print(numbers.prefix(2))
// Prints "[1, 2]"
print(numbers.prefix(10))
// Prints "[1, 2, 3, 4, 5]"
func suffix(Int) -> ArraySlice<Element>
:指定した数の要素を最後から全て(配列)取得
let numbers = [1, 2, 3, 4, 5]
print(numbers.suffix(2))
// Prints "[4, 5]"
print(numbers.suffix(10))
// Prints "[1, 2, 3, 4, 5]"
func dropFirst(Int) -> ArraySlice<Element>
:指定した位置以降の全ての要素(配列)を取得
let numbers = [1, 2, 3, 4, 5]
print(numbers.dropFirst(2))
// Prints "[3, 4, 5]"
print(numbers.dropFirst(10))
// Prints "[]"
func dropLast(Int) -> ArraySlice<Element>
:指定した位置までの全ての要素(配列)を取得
let numbers = [1, 2, 3, 4, 5]
print(numbers.dropLast(2))
// Prints "[1, 2, 3]"
print(numbers.dropLast(10))
// Prints "[]"

要素を検索して取得

func contains(where: (Element) -> Bool) -> Bool
:条件に合う要素が含まれるかどうか
let expenses = [21.37, 55.21, 9.32, 10.18, 388.77, 11.41]
let hasBigPurchase = expenses.contains { $0 > 100 }
// 'hasBigPurchase' == true
func allSatisfy((Element) -> Bool) -> Bool
:条件を全ての要素が満たすかどうか
let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
let allHaveAtLeastFive = names.allSatisfy({ $0.count >= 5 })
// allHaveAtLeastFive == true
func first(where: (Element) -> Bool) -> Element?
:条件を満たす最初の要素を取得
let numbers = [3, 7, 4, -2, 9, -6, 10, 1]
if let firstNegative = numbers.first(where: { $0 < 0 }) {
    print("The first negative number is \(firstNegative).")
}
// Prints "The first negative number is -2."
func firstIndex(where: (Element) -> Bool) -> Int?
:条件を満たす最初のIndexを取得
var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.firstIndex(of: "Maxime") {
    students[i] = "Max"
}
print(students)
// Prints "["Ben", "Ivy", "Jordell", "Max"]"
func last(where: (Element) -> Bool) -> Element?
:条件を満たす最後の要素を取得
let numbers = [3, 7, 4, -2, 9, -6, 10, 1]
if let lastNegative = numbers.last(where: { $0 < 0 }) {
    print("The last negative number is \(lastNegative).")
}
// Prints "The last negative number is -6."
func lastIndex(where: (Element) -> Bool) -> Int?
:条件を満たす最後のIndexを取得
let students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
if let i = students.lastIndex(where: { $0.hasPrefix("A") }) {
    print("\(students[i]) starts with 'A'!")
}
// Prints "Akosua starts with 'A'!"
func filter((Element) -> Bool) -> [Element]
:条件に合った全ての要素(配列)を取得
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let shortNames = cast.filter { $0.count < 5 }
print(shortNames)
// Prints "["Kim", "Karl"]"

各要素に処理を加えて取得

func map<T>((Element) -> T) -> [T]
:処理を加えた全ての要素(配列)を取得
let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.count }
// 'letterCounts' == [6, 6, 3, 4]
func flatMap<SegmentOfResult>((Element) -> SegmentOfResult) -> [SegmentOfResult.Element]
:処理を加えた全ての要素を一つの配列にしてから取得
let numbers = [1, 2, 3, 4]

let mapped = numbers.map { Array(repeating: $0, count: $0) }
// [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
func compactMap<ElementOfResult>((Element) -> ElementOfResult?) -> [ElementOfResult]
:処理を加えた全てのnil以外の要素(配列)を取得
let possibleNumbers = ["1", "2", "three", "///4///", "5"]

let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
// [1, 2, nil, nil, 5]

let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
// [1, 2, 5]

その他

for-inループとforEachの違い

func forEach((Element) -> Void)
let numberWords = ["one", "two", "three"]
for word in numberWords {
    print(word)
}
// Prints "one"
// Prints "two"
// Prints "three"

numberWords.forEach { word in
    print(word)
}
// Same as above

forEachでは、

  • breakcontinueを使って、ボディクロージャの現在の呼び出しを終了したり、後続の呼び出しをスキップはできない

  • ボディクロージャでreturnを使用すると、ボディクロージャの現在の呼び出しのみから終了し、外部スコープからは終了せず、後続の呼び出しもスキップしない

おわりに

多すぎて全てを網羅することはできませんでした。。。必要になったものがあれば、都度追記してみたいと思います。表現が間違っている箇所あるかもしれません。ご指摘いただけると嬉しいです。

参考

ocumentation/swift/sequence

documentation/swift/collection

documentation/swift/sequence/filter

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2