Swift 4で、文字列の配列[String]から最長・最短の文字列を取得する例です。文字数を比較するクロージャーを、max(by:)とmin(by:)に渡します。
let strs:[String] = [
"北九州市 (きたきゅうしゅう)", // max
"久留米市 (くるめ)",
"鳥栖市 (とす)", // min
"伊万里市 (いまり)",
"神埼市 (かんざき)",
]
// 最大長を取得する byには「昇順」になるように指定する。
if let maxstr = strs.max(by: {$1.count > $0.count}) {
print(maxstr) // 北九州市 (きたきゅうしゅう)
}
// 最小長を取得する byにはmaxと同じく、「昇順」になるように指定する。
if let minstr = strs.min(by: {$1.count > $0.count}) {
print(minstr) // 鳥栖市 (とす)
}
max(by:)とmin(by:)には、どちらも文字数が昇順になるように比較するクロージャーを指定します。
max(by:) - Array | Apple Developer Documentation
areInIncreasingOrder A predicate that returns true if its first argument should be ordered before its second argument; otherwise, false.
min(by:) - Array | Apple Developer Documentation
areInIncreasingOrder A predicate that returns true if its first argument should be ordered before its second argument; otherwise, false.
同じ長さの文字列がある場合
同じ長さの文字列が複数ある場合の結果も確認します。
let strs:[String] = [
"小林市 (こばやし)",
"日南市 (ニチナン)",
"延岡市 (のべおか)",
"日向市 (ひゅうが)",
"宮崎市 (みやざき)",
]
// 最大長を取得する byには「昇順」になるように指定する。
if let maxstr = strs.max(by: {$1.count > $0.count}) {
print(maxstr) // 小林市 (こばやし)
}
// 最小長を取得する byにはmaxと同じく、「昇順」になるように指定する。
if let minstr = strs.min(by: {$1.count > $0.count}) {
print(minstr) // 小林市 (こばやし)
}
この例では、どちらも配列の先頭にある「小林市 (こばやし)」が返されました。
比較演算子を変更した場合の結果
比較演算子を>から>=に変更した場合の結果も確認しました。
比較演算子を変更
{$1.count > $0.count}
↓
{$1.count >= $0.count}
let strs:[String] = [
"小林市 (こばやし)",
"日南市 (ニチナン)",
"延岡市 (のべおか)",
"日向市 (ひゅうが)",
"宮崎市 (みやざき)",
]
// 最大長を取得する byには「昇順」になるように指定する。
if let maxstr = strs.max(by: {$1.count >= $0.count}) {
print(maxstr) // 宮崎市 (みやざき)
}
// 最小長を取得する byにはmaxと同じく、「昇順」になるように指定する。
if let minstr = strs.min(by: {$1.count >= $0.count}) {
print(minstr) // 宮崎市 (みやざき)
}
この実行例では、どちらも配列の末尾にある「宮崎市 (みやざき)」が返されました。
参考
Swift - best practice to find the longest string at [String] array - Stack Overflow
max(by:) - Array | Apple Developer Documentation min(by:) - Array | Apple Developer Documentation