Range <Int>を[Int]にすばやく変換する


107

範囲を配列に変換する方法

私は試した:

let min = 50
let max = 100
let intArray:[Int] = (min...max)

エラーが出る Range<Int> is not convertible to [Int]

私も試しました:

let intArray:[Int] = [min...max]

そして

let intArray:[Int] = (min...max) as [Int] 

それらも機能しません。

回答:


204

キャストするのではなく、を使用してを作成する必要がありますArray<Int>Range<Int>

let intArray: [Int] = Array(min...max)

1
おかげで、私はあなたがあなたの答えを送っている間にそれを理解しました
ハイタム'19

これは範囲が大きい場合にクラッシュするようです:values valuesArray:[Int64] = Array(1 ... 4294967292)-Int64ではなくIntしか処理できないためか?
Daniel Springer

2
@DanielSpringer:問題の原因となっているのは配列の値ではなく、言語仕様で修正された範囲を超えるインデックスです。この巨大なアレイを保持するためだけに、必要なRAMを計算してください。
ユーザー不明の

@userunknownなので、値のタイプではなく、値の量?おっと、ありがとう!
Daniel Springer

1
@Daniel Springer、これはRandomGeneratorを確実に使用する必要があるタスクのように聞こえます。いくつかのオプションについては、こちらを参照してください。hackingwithswift.com
Klaus Busse


14

私はそれを考え出した:

let intArray = [Int](min...max)

他の誰かに信用を与える。


13

行う:

let intArray = Array(min...max)

Arrayイニシャライザがを取り、SequenceTypeRange準拠しているため、これは機能するはずSequenceTypeです。


10

使用する map

let min = 50
let max = 100
let intArray = (min...max).map{$0}

なぜそれが機能するのかを追加すると、この種の質問を読んでいる人にとって有益になるでしょう。たとえば、Sequenceプロトコルを実装するCoutableClosedRangeを作成するため、マップが可能であり、マップ操作の実行時に新しいintを遅延して生成するとします。一部の背景知識は常に優れています
denis631

他の答えは興味深いですが、これは実際に質問に答えます。ビッグアップ。
Dan Rosenstark、

3

(少なくとも、Swift 3およびXcode 8では)Range<Int>オブジェクトを直接使用できないのは興味深いことです。

let range: Range<Int> = 1...10
let array: [Int] = Array(range)  // Error: "doesn't conform to expected type 'Sequence'"

したがって、前述のように、次のように範囲を手動で「アンラップ」する必要があります。

let array: [Int] = Array(range.lowerBound...range.upperBound)

つまり、リテラルのみ使用できます。


これは、範囲がコレクションではないためです。RangeとCountable Rangeの違いは、後者はInteger値で反復できることです。そのため、Countable RangeはSwiftではコレクション型ですが、範囲はそうではありません。
Corey Zambonie 2017年

そうです、私はこれを期待していませんでした。つまり、2つの異なる範囲クラスです。おそらくのPythonic解釈によるものですrange()
devforfu 2017年

1

Swift 3 / Xcode 8にはCountableRange便利なタイプがあります:

let range: CountableRange<Int> = -10..<10
let array = Array(range)
print(array)
// prints: 
// [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

これは、直接使用することができますfor- inループ:

for i in range {
    print(i)
}

これが(今のところ)タスクを処理する正しい方法です。Swift 4でも動作します
アッシュ

0

このような関数でreduce()を使用してClosedRange&Rangeインスタンス間隔を実装できます。

func sumClosedRange(_ n: ClosedRange<Int>) -> Int {
    return n.reduce(0, +)
}
sumClosedRange(1...10) // 55


func sumRange(_ n: Range<Int>) -> Int {
    return n.reduce(0, +)
}
sumRange(1..<11) // 55
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.