2015-08-15 13 views
5

Qual è il codice alternativo in rapido di questo codice?Qual è l'equivalente di questo codice obiettivo-c in swift?

static inline CGFloat randomInRangeScale(CGFloat scale) 
{ 
    CGFloat value = arc4random_uniform(INT16_MAX); 
    return value * 0.000015 + 0.8 ; 
} 

ho provato questo:

func randomInRangeScale(scale : CGFloat) -> CGFloat 
{ 
    let value : CGFloat = arc4random_uniform(UInt16); 
    return value * 0.000015 + 0.8 ; 
} 

ma mi dà un errore "Cannot invoke 'arc4random_uniform' with an argument list of type '((UInt16).Type)"

+1

Si dovrebbe pubblicare ciò che hai provato. – Avt

+0

sorry .......... –

+0

inline in swift può essere ottenuto come @inline e può utilizzare UInt16.max –

risposta

0

Il tipo di parametro del arc4random_uniform è UInt32, quindi bisogna lanciare il UINT16_MAX-UInt32 e lanciare il valore a CGFloat.

Prova questo:

func randomInRangeScale(scale : CGFloat) -> CGFloat { 
    let value = arc4random_uniform(UInt32(UINT16_MAX)); 
    return CGFloat(value) * 0.000015 + 0.8; 
} 
0

Questo dovrebbe fare il lavoro

func randomInRangeScale(scale : CGFloat) -> CGFloat { 
    let random = arc4random_uniform(UInt32(UInt16.max)) 
    let randomCGFloat = CGFloat(random) 
    return randomCGFloat * 0.000015 + 0.8 
} 
+1

@Avt Questa risposta ha corretto un errore di compilazione della risposta. Il valore di ritorno di 'arc4random_uniform' è 'UInt32', non' CGFloat'. –

+0

@Avt: stavi passando un 'UInt16' come parametro a' arc4random_uniform'. Il tuo codice non ha funzionato. Quindi hai modificato la tua domanda. –

+0

@ 0x7fffffff sì, hai ragione. Chiedo scusa. – Avt

0

provare come estensione sul CGFloat come -

extension CGFloat { 
static func randomFloat() -> CGFloat { 
    return CGFloat(arc4random_uniform(UInt32(UInt16.max))) * 0.000015 + 0.8 
    } 
} 

e lo chiamano con -

CGFloat.randomFloat() 

Dopo aver eseguito alcuni test, è stato necessario richiamarlo in un ciclo 100 milioni di volte sul thread principale e sembra più veloce che se la stessa funzione fosse implementata come metodo.

Ecco il test -

let loopIterationCount = 100000000 
    var timestamp = NSDate() 
    for var k = 0 ; k < loopIterationCount ; k++ { 
     let x = CGFloat.randomFloat() 
    } 
    var timeStampEnd = NSDate() 
    println("CGFloat extension took \(self.timeDifference(timestamp, endTime: timeStampEnd)) seconds.") 

    timestamp = NSDate() 
    for var k = 0 ; k < loopIterationCount ; k++ { 
     let x = self.randomFloat() 
    } 
    timeStampEnd = NSDate() 
    println("function took \(self.timeDifference(timestamp, endTime: timeStampEnd)) seconds.") 

func randomFloat() -> CGFloat { 
    return CGFloat(arc4random_uniform(UInt32(UInt16.max))) * 0.000015 + 0.8 
} 

func timeDifference(startTime: NSDate, endTime: NSDate) -> NSTimeInterval { 
    return endTime.timeIntervalSinceDate(startTime) 
} 

Il risultato

estensione CGFloat preso 3.19389200210571 secondi.

la funzione ha richiesto 5,25490999221802 secondi.

Problemi correlati