回答:
Swift配列の最初のN個の要素を取得する最も簡単な方法は、以下を使用することprefix(_ maxLength: Int)
です。
let someArray = [1, 2, 3, 4, 5, 6, 7]
let first5 = someArray.prefix(5) // 1, 2, 3, 4, 5
これには、境界が安全であるという利点があります。渡したカウントがprefix
配列のカウントよりも大きい場合は、配列全体が返されます。
注:コメントで指摘したように、Array.prefix
実際に返しArraySlice
、ありませんArray
。ほとんどの場合、これで違いが生じることはありませんが、結果をArray
型に割り当てる必要がある場合、またはArray
パラメーターを期待しているメソッドに渡す必要がある場合は、結果を型に強制する必要がありますArray
。let first5 = Array(someArray.prefix(5))
dropFirst
とdropLast
、とても同様かもしれないtakeFirst
とtakeLast
。
first5
、配列、ちょうど書き込みするlet first5 = Array(someArray.prefix(5))
video = video.prefix(5)
Xcode 7.2の私のプロジェクトでは、コンパイルエラーが発生します Cannot assign value of type 'ArraySlice<Video>' to type '[Video]'
video = Array(video.prefix(5))
prefix
はSwift 2.xのみである可能性があります(1.xであったかどうかは覚えていません)が、iOS 7以上のSwift 2.xをサポートするすべてのOSに確かに存在します。Swift機能を利用できるかどうかは、iOSバージョンではなく、Swiftリリースによって決まります。
更新:prefix
配列の最初のn個の要素を取得するため
に使用できるようになりました。接頭辞の使用方法の説明については、@ mluisbrownの回答を確認してください。
元の回答:
なしでfilter
、map
またはreduce
単に配列の範囲を返すだけで、非常に簡単に行うことができます。
var wholeArray = [1, 2, 3, 4, 5, 6]
var n = 5
var firstFive = wholeArray[0..<n] // 1,2,3,4,5
n
Swift配列の最初の項目だけが必要な場合wholeArray.prefix(n)
は、境界を安全にするという追加の利点があります。n
が配列サイズより大きい場合は、配列prefix
全体を返します。
wholeArray
要素数がこれより多くない場合はクラッシュしますn
prefix
。
Swift 5では、必要に応じて、問題を解決するために次の6つのPlaygroundコードのいずれかを選択できます。
subscript(_:)
下付き文字の使用let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array[..<5]
//let arraySlice = array[0..<5] // also works
//let arraySlice = array[0...4] // also works
//let arraySlice = array[...4] // also works
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
prefix(_:)
メソッドの使用複雑さ:コレクションがに準拠している場合はO(1)RandomAccessCollection
。それ以外の場合は、O(k)です。kは、コレクションの最初から選択する要素の数です。
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(5)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
アップルの状態prefix(_:)
:
最大長がコレクション内の要素数を超える場合、結果にはコレクション内のすべての要素が含まれます。
prefix(upTo:)
メソッドの複雑さ:O(1)
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(upTo: 5)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
アップルの状態prefix(upTo:)
:
この
prefix(upTo:)
メソッドを使用することは、コレクションの添え字として部分的に開いた部分的な範囲を使用することと同じです。添え字表記の方が優先されprefix(upTo:)
ます。
prefix(through:)
メソッドの使用let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let arraySlice = array.prefix(through: 4)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
removeSubrange(_:)
メソッドの複雑さ:O(n)。ここで、nはコレクションの長さです。
var array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
array.removeSubrange(5...)
print(array) // prints: ["A", "B", "C", "D", "E"]
dropLast(_:)
メソッドの複雑さ:コレクションがに準拠している場合はO(1)RandomAccessCollection
。それ以外の場合、O(k)。ここで、kはドロップする要素の数です。
let array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L"]
let distance = array.distance(from: 5, to: array.endIndex)
let arraySlice = array.dropLast(distance)
let newArray = Array(arraySlice)
print(newArray) // prints: ["A", "B", "C", "D", "E"]
SWIFT 4
別のソリューション:
配列が短すぎてもクラッシュしない簡単なインラインソリューション
[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 3 ? $0.element : nil }
しかし、これでうまくいきます。
[0,1,2,3,4,5].enumerated().compactMap{ $0.offset < 1000 ? $0.element : nil }
通常、これを行うとクラッシュします。
[0,1,2,3,4,5].prefix(upTo: 1000) // THIS CRASHES
[0,1,2,3,4,5].prefix(1000) // THIS DOESNT
[0,1,2,3,4,5].enumerated().flatMap{ $0.offset < 1000 ? $0.element : nil }
配列の最初の5つの要素を取得するには、問題の配列をスライスするだけです。Swiftでは、次のようにします。array[0..<5]
。
配列の最初のN個の要素の選択をもう少し機能的で一般化できるようにするには、それを行うための拡張メソッドを作成します。例えば:
extension Array {
func takeElements(var elementCount: Int) -> Array {
if (elementCount > count) {
elementCount = count
}
return Array(self[0..<elementCount])
}
}
Swift 4の更新:
[0,1,2,3,4,5].enumerated().compactMap{ $0 < 10000 ? $1 : nil }
Swift 3の場合:
[0,1,2,3,4,5].enumerated().flatMap{ $0 < 10000 ? $1 : nil }
オブジェクトの配列の場合、Sequenceから拡張を作成できます。
extension Sequence {
func limit(_ max: Int) -> [Element] {
return self.enumerated()
.filter { $0.offset < max }
.map { $0.element }
}
}
使用法:
struct Apple {}
let apples: [Apple] = [Apple(), Apple(), Apple()]
let limitTwoApples = apples.limit(2)
// limitTwoApples: [Apple(), Apple()]
n
Array