hızlı dönüştürme Aralığı <Int> - [Int]


107

Aralığı Diziye dönüştürme

Denedim:

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

hata almak Range<Int> is not convertible to [Int]

Ben de denedim:

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

ve

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

onlar da çalışmıyor.

Yanıtlar:


204

Sen gerek oluşturmak bir Array<Int>kullanarak Range<Int>yerine dökme bunu ing.

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

1
teşekkürler, cevabını gönderirken anladım
haitham

Aralık büyükse bu çöküyor gibi görünüyor: let valuesArray: [Int64] = Array (1 ... 4294967292) - belki de Int64'ü değil de yalnızca Int işleyebildiği içindir?
Daniel Springer

2
@DanielSpringer: Soruna neden olan, Dizideki değer değil, dil belirtiminde belirlenen sınırları aşan dizin. Lütfen bu devasa Diziyi tutmak için ne kadar RAM'e ihtiyacınız olduğunu hesaplayın.
kullanıcı bilinmiyor

@userunknown yani değer türü değil, değerlerin miktarı? Yakaladım, teşekkürler!
Daniel Springer

1
@Daniel Springer, bu kesinlikle RandomGenerator kullanmanız gereken bir görev gibi geliyor, buradaki bazı seçeneklere bakın: hackingwithswift.com/articles/102/…
Klaus Busse


14

Bunu anladım:

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

Başkasına kredi vermek.


13

yapmak:

let intArray = Array(min...max)

Bu işe yaramalı çünkü Arraybir başlatıcıya sahip SequenceTypeve Rangeuygun SequenceType.


10

Kullanım map

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

bu tür soruları okuyan insanlar için neden işe yaradığını eklemek faydalı olacaktır. Örneğin, Sıra protokolünü uygulayan bir CoutableClosedRange oluşturduğunu, bu nedenle eşlemenin mümkün olduğunu ve harita işlemi gerçekleştirirken tembel olarak yeni bir intibak verdiğini belirtmek. Bazı arka plan bilgileri her zaman iyidir
denis631

Diğer cevaplar ilginç ama bu aslında soruyu cevaplıyor. Büyü.
Dan Rosenstark

3

İlginçtir ki (en azından Swift 3 ve Xcode 8 ile) Range<Int>nesneyi doğrudan kullanamazsınız :

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

Bu nedenle, daha önce bahsedildiği gibi, aşağıdaki gibi aralıkları manuel olarak "sarmalamanız" gerekir:

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

Yani, sen yapabilirsiniz yalnızca hazır bilgi kullanın.


Bunun nedeni, Aralıkların Koleksiyon olmamasıdır. Aralık ve Sayılabilir Aralık arasındaki fark, ikincisinin bir Tamsayı değeriyle yinelenebilmesidir. Bu nedenle Sayılabilir Aralık, swift'te bir toplama türüdür, ancak aralık değildir.
Corey Zambonie

Bu doğru ve bunu beklemiyordum, yani iki farklı menzil sınıfı. Muhtemelen Pythonic yorumundan kaynaklanmaktadır range().
devforfu

1

Swift 3 / Xcode 8'den beri CountableRangekullanışlı olabilecek bir tür var :

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]

Bu doğrudan kullanılabilir for- indöngüler:

for i in range {
    print(i)
}

Bu (şimdi) görevi yerine getirmenin doğru yoludur. Ayrıca Swift 4'te de çalışıyor.
Ash

0

Bu gibi işlevlerde küçültme () ile ClosedRange & Range örnek aralıklarını uygulayabilirsiniz.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.