2015-08-15 17 views
5

Bu kodun hızlıca alternatif kodu nedir?Bu hedef-c kodunun eşdeğeri ne kadardır?

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

bu çalıştı:

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

Ama bana bir hata verir "Cannot invoke 'arc4random_uniform' with an argument list of type '((UInt16).Type)"

+1

Denediğin şeyi yayınlamalısın. – Avt

+0

üzgün .......... –

+0

hızlı bir şekilde satır içi @inline gibi olabilir ve INT16_MAX eşdeğeri istiyorsanız UInt16.max –

cevap

0

Eğer UInt32 için UINT16_MAX döküm zorunda ve dökme yüzden arc4random_uniform parametre tipi, UInt32 olduğunu CGFloat için değer.

bu deneyin:

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

Bu işi yapmak gerekir

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

@Avt Bu cevap, yanıtınızın bir derleme hatası verdi. "Arc4random_uniform" öğesinin dönüş değeri, "CGFloat" değil, "UInt32" dir. –

+0

@Avt: Bir "UInt16" yi "arc4random_uniform" olarak param olarak geçiriyordunuz. Kodunuz işe yaramadı. Sonra sorunuzu düzenlediniz. –

+0

@ 0x7fffffff evet, haklısınız. Özür dilerim. – Avt

0

gibi CGFloat üzerinde bir uzantısı olarak deneyin -

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

ve kullanma diyoruz -

CGFloat.randomFloat() 

Ana iş parçacığı üzerinde 100 milyon kez döngü içinde çağrılan bazı sınamalar yürüttükten sonra ve aynı işlev bir yöntem olarak uygulanmış olduğundan daha hızlı görünüyor.

CGFloat uzatma 3,19389200210571 saniye sürdü

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

sonuç -

İşte test.

işlevi 5.25490999221802 saniye sürdü.