Come inizializzare tutti i membri di un array sullo stesso valore in Swift?


87

Ho una vasta gamma in Swift. Voglio inizializzare tutti i membri sullo stesso valore (cioè potrebbe essere zero o qualche altro valore). Quale sarebbe l'approccio migliore?


2
Crea l'array, passa in rassegna tutti gli elementi e imposta ciascuno di essi, proprio come faresti in qualsiasi altro linguaggio di programmazione.
— Robert Harvey

19
var a = Array(count:100, repeatedValue:0)è esattamente la risposta a questa valida domanda.
— Rod

@ Rod, ci proverò. Se la domanda viene riaperta puoi pubblicarla come risposta.
— m_power

2
Il looping è almeno un ordine di grandezza più lento rispetto all'utilizzo della matematica vettoriale.
— μολὼν.λαβέ

Risposte:


174

In realtà, è abbastanza semplice con Swift. Come accennato nel documento di Apple , puoi inizializzare un array con lo stesso valore ripetuto come questo:

Con la vecchia versione Swift :

var threeDoubles = [Double](count: 3, repeatedValue: 0.0)

A partire da Swift 3.0 :

var threeDoubles = [Double](repeating: 0.0, count: 3)

che darebbe:

[0.0, 0.0, 0.0]

16
Sembra che in Swift3 sia cambiato invar threeDoubles = [Double]( repeating: 0.0, count: 3 )
— ppaulojr

Ho scoperto che questo è davvero sloooooooow, un array da 16 MB impiega pochi secondi per cancellare in questo modo. In C, memset(p, 0, 16*1024*1024)è praticamente istantaneo.
— wcochran

@wcochran Hai scoperto un modo migliore per farlo?
— StephenBoesch

@javadba No. Ancora sorpreso che non ci sia alcun meccanismo efficiente per farlo in Swift quando l'hardware può farlo velocemente. Forse vale la pena indagare sulla fonte.
— wcochran

36

Questa sarebbe una risposta in Swift 3:

var threeDoubles = [Double]( repeating: 0.0, count: 3 )

1
Autosuggest states [Double] (repeatElement (3.22, count: 5)), ancora la digitazione esplicita (repeating, count) sembra essere valida
— Ashwin G
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.