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.

Antworten:


202

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

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

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


14

Ich habe es herausgefunden:

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

Jemand anderem Ehre machen.


13

machen:

let intArray = Array(min...max)

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


10

Verwenden map

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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.