2015-08-15 14 views
5

Jaki jest kod alternatywny w swift tego kodu?Jaki jest odpowiednik tego kodu celu-c w szybkim tempie?

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

Próbowałem to:

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

Ale to daje mi błąd "Cannot invoke 'arc4random_uniform' with an argument list of type '((UInt16).Type)"

+1

Powinieneś opublikować, co próbujesz. – Avt

+0

Przepraszam .......... –

+0

inline w swift będzie można uzyskać jak @ line i można użyć UInt16.max –

Odpowiedz

0

Rodzaj parametr arc4random_uniform jest UInt32, więc trzeba rzucić UINT16_MAX do UInt32 i rzucać wartość do CGFloat.

Spróbuj tego:

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

To powinno załatwić sprawę

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

@Avt Ta odpowiedź naprawiła błąd kompilacji odpowiedzi. Wartością zwracaną przez 'arc4random_uniform' jest' UInt32', a nie 'CGFloat'. –

+0

@Avt: Mijałeś 'UInt16' jako parametr" arc4random_uniform ". Twój kod nie działa. Potem edytowałeś swoje pytanie. –

+0

@ 0x7fffffff yep, masz rację. Przepraszam. – Avt

0

Wypróbuj go jako rozszerzenie na CGFloat podobnego -

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

i nazwać użyciem -

CGFloat.randomFloat() 

Po uruchomieniu kilku testów, które wymagały wywołania go w pętli 100 milionów razy na wątku głównym i wydaje się szybsze, niż gdyby ta sama funkcja została zaimplementowana jako metoda.

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

Wynik

CGFloat przedłużenie wziął 3.19389200210571 sekund.

funkcja zajęła 5.25490999221802 sekund.

Powiązane problemy