Swift konvertiert Range <Int> in [Int]

107

wie man Range in Array konvertiert

Ich habe es versucht:

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

Fehler bekommen Range<Int> is not convertible to [Int]

Ich habe auch versucht:

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

und

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

Sie funktionieren auch nicht.

Haitham
quelle

Antworten:

202

Sie müssen eine mit erstellenArray<Int> , Range<Int>anstatt sie zu gießen .

let intArray: [Int] = Array(min...max)
David Skrundz
quelle
1
danke, ich habe es gerade herausgefunden, als du deine Antwort geschickt hast
haitham
Dies scheint abzustürzen, wenn der Bereich groß ist: let valuesArray: [Int64] = Array (1 ... 4294967292) - vielleicht weil es nur Int und nicht Int64 verarbeiten kann?
Daniel Springer
2
@DanielSpringer: Es ist nicht der Wert im Array, der das Problem verursacht, sondern der Index, der die in der Sprachspezifikation festgelegten Grenzen überschreitet. Bitte berechnen Sie, wie viel RAM Sie benötigen, nur um dieses riesige Array aufzunehmen.
Benutzer unbekannt
@userunknown also nicht die Art des Wertes, sondern die Anzahl der Werte? Gotcha, danke!
Daniel Springer
1
@ Daniel Springer, das klingt nach einer Aufgabe, bei der Sie unbedingt einen RandomGenerator verwenden sollten. Einige Optionen finden Sie hier: hackingwithswift.com/articles/102/…
Klaus Busse
37

Setzen Sie den Bereich in die Init.

let intArray = [Int](min...max)
Herr Beardsley
quelle
Perfekt! Danke @ MrBeardsley
Phillip Jacobs
14

Ich habe es herausgefunden:

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

Jemand anderem Ehre machen.

Haitham
quelle
13

machen:

let intArray = Array(min...max)

Dies sollte funktionieren, da Arrayein Initialisierer a nimmt SequenceTypeund Rangekonform ist SequenceType.

ad121
quelle
10

Verwenden map

let min = 50
let max = 100
let intArray = (min...max).map{$0}
vadian
quelle
Das Hinzufügen, warum es funktioniert, wäre für Leute von Vorteil, die diese Art von Fragen lesen. Wenn Sie beispielsweise angeben, dass ein CoutableClosedRange erstellt wird, der das Sequenzprotokoll implementiert, ist eine Zuordnung möglich, und bei der Ausführung der Kartenoperation wird eine neue int träge ausgegeben. Einige Hintergrundkenntnisse sind immer gut
denis631
Die anderen Antworten sind interessant, aber diese beantwortet tatsächlich die Frage. Groß auf.
Dan Rosenstark
3

Interessant, dass Sie das Range<Int>Objekt (zumindest mit Swift 3 und Xcode 8) nicht direkt verwenden können:

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

Daher müssen Sie, wie bereits erwähnt, Ihren Bereich wie folgt manuell "auspacken":

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

Dh du kannst nur Literal verwenden.

devforfu
quelle
Der Grund dafür ist, dass Bereiche keine Sammlungen sind. Der Unterschied zwischen Range und Countable Range besteht darin, dass letzterer durch einen Integer-Wert wiederholt werden kann. Aus diesem Grund ist Countable Range ein Sammlungstyp in Swift, Range jedoch nicht.
Corey Zambonie
Das ist richtig, und ich hatte das nicht erwartet, dh zwei verschiedene Bereichsklassen. Wahrscheinlich aufgrund der pythonischen Interpretation von range().
Devforfu
1

Seit Swift 3 / Xcode 8 gibt es einen CountableRangeTyp, der praktisch sein kann:

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]

Es kann direkt in verwendet werden for- inSchleifen:

for i in range {
    print(i)
}
Killobatt
quelle
Dies ist (jetzt) ​​der richtige Weg, um die Aufgabe zu erledigen. Funktioniert auch in Swift 4.
Ash
0

Sie können ClosedRange & Range-Instanzintervalle mit redu () in Funktionen wie diesen implementieren.

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
Edison
quelle