Obj-C > Swift3 - 32 en 64 bit CGFloat

Ik heb een stukje code


CGFloat(arc4random() % Int32((viewHeight - inpFieldHeight)))

en wil dit omzetten naar swift3


let yReplaced = CGFloat(arc4random() % Int32((viewHeight - inpFieldHeight))) - geeft Binary operator % cannot be applied

ging er van uit dat het volgende in orde zou zijn,

let yReplaced = CGFloat( Int32(arc4random()) % Int32((viewHeight - inpFieldHeight)))

maar helaas crashed het op die regel, ondanks dat er geen fout melding is tijden het compileren.

Probleem hier lijkt me dat CGFloat op een 32 bit machine dus 32 bit is en op een 64 bit dus 64 bits.
of

 let viewWidth: CGFloat  = self.view.bounds.size.width
    let x = CGFloat(CGFloat(arc4random()) % (viewWidth - inpFieldHeight))

geeft dan weer dat ik de % moet vervangen voor truncaitingRemainder.

inpFieldHeight is een CGFloat
let inpFieldHeight: CGFloat = 42

Hoe kan ik dit oplossen? Of is het iets anders?
Enige suggesties?

Geen idee wat je probeert te bereiken maar modulo (%) is bedoeld voor gehele getallen. Lees Dit maar eens

En de nauwkeurigheid van getallen heeft weinig met de bit-diepte van de processor te maken. Zat 8-bit computers die 80 bit float sommen kunnen maken. De oudste wetenschappelijke rekenmachines hadden zelfs 4-bit code voor 32-bit rekennauwkeurigheid.

Bedankt voor jullie reacties

Het gaat niet om de nauwkeurig heid het gaat om CGFloat, en het gaat niet waarom ik het nodig heb of niet, maar zoals ik schreef is CGFloat op een64 bit machine goter dan op een 32bit machine. Dus van waar de melding als het niet uit zou maken. Hoe kan je dus een crash vermeiden in deze situatie bijgebruik van CGFloat.

https://developer.apple.com/reference/coregraphics/cgfloat

zegt dat CGFloat op eene 64 bit machine een Double is en op een 32 bit een float.

ik heb nu
let x = CGFloat(CGFloat(arc4random()).truncatingRemainder (dividingBy: viewWidth - inpFieldWidth))
en dat werkt.

Ik ben nog maar net begonnen met Swift en kan er naast zitten, maar zou het niet meer in de Swift style passen om dit zo op te schrijven?

if let x = CGFloat(arc4random()).truncatingRemainder (dividingBy:  viewWidth – inpFieldWidth) as? CGFloat {
// do someting
}

Of misschien is de typecasting al helemaal niet meer nodig?

Je zou best gelijk hebben. Maar kan je aanvullen waarom je een ‘if x is CGFloat’ zou willen doen. x is een variabele met een waarde die ik altijd nodig heb, waarom zou ik deze afhankelijk maken.

arc4random is een UINT32 en CGFloat kan 32 of 64 bit zijn.
Dus ik vertrouw erop dat de compiler en OS weet wat het dan moet doen.

Maar je tips zijn welkom. Ik ben ook een beginner qua swift, al paar maanden, oke, in totaal misschien 20 uur, en helaas erg weinig tijd om aan dit project te werken.

Wat gebeurt er als

viewWidth – inpFieldWidth

gelijk is aan nul, krijg je dan een crash? Daarom dacht ik dat die if let x handig zou kunnen zijn. Of misschien kun je guard gebruiken.