web-dev-qa-db-ja.com

swift Range <Int>を[Int]に変換

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

私は試した:

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] 

彼らも動作しません。

80
haitham

cast ingではなく、Array<Int>を使用してcreate an Range<Int>を実行する必要があります。

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

範囲をinitに入れます。

let intArray = [Int](min...max)
32
Mr Beardsley

行う:

let intArray = Array(min...max)

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

13
ad121

私はそれを考え出した:

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

他の誰かにクレジットを与える。

13
haitham

mapを使用します

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

(少なくとも、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)

つまり、canリテラルのみを使用します。

2
devforfu

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)
}
1
killobatt

このような関数では、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
0
tymac