酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Swiftでreduceメソッドを使って配列の中から文字列長の長いオブジェクトを取得する

Swiftで配列の中から文字列長の長いオブジェクトを取得する方法を紹介します。

ここではString型の配列特定のクラスのString型プロパティの配列から最も長い文字列を持つオブジェクトを取得します。判定の仕方を変更すれば文字列以外での判定をおこなうことも可能です。

スワローズの投手から適当にピックアップしてきました。後述する配列の中で一番名前が長いのは「金伏 ウーゴ」選手です。

String型の配列で最も長い文字列を取得する

文字数を取得するためにはcountメソッドを使います。String型の配列stringsのreduceメソッドを使います。reduceメソッドは与えられたシーケンスを1つの値にまとめることができます。シーケンスの合計を求めることに使われるケースがよく紹介されています。

// 人物名を格納した配列
var strings = ["由規", "石山 泰稚", "秋吉 亮",
    "村中 恭兵", "バーネット", "金伏 ウーゴ"]

// 一番長い人名の選手を取得する
let name = strings.reduce(strings[0], combine: {
    if count($0) > count($1) {
        return $0
    } else {
        return $1
    }
})

// 出力
println(name)

上記のサンプルコードのPlaygroundでの出力を見てみましょう。

f:id:ch3cooh393:20150504121825p:plain

特定のクラスのString型のプロパティで最も長い文字列を持つオブジェクトを取得する

応用例です。例えば、以下のようなPersonクラスがあるとします。プロパティにはString型のnameだけを持っています。

class Person {
    let name: String
    
    init(_ name: String) {
        self.name = name
    }
}

前述した比較方法と同じようにreduceメソッドを使って一番長い名前の選手を取得しています。

// 人物名を格納したPerson
var array = [Person]()
array.append(Person("由規"))
array.append(Person("石山 泰稚"))
array.append(Person("秋吉 亮"))
array.append(Person("村中 恭兵"))
array.append(Person("バーネット"))
array.append(Person("金伏 ウーゴ"))

// 一番長い人名の選手を取得する
let maxElement = array.reduce(array[0], combine: {
    if count($0.name) > count($1.name) {
        return $0
    } else {
        return $1
    }
})

// 出力
println(maxElement.name)

上記のサンプルコードのPlaygroundでの出力を見てみましょう。

f:id:ch3cooh393:20150504115241p:plain