7 berichten aan het bekijken - 1 tot 7 (van in totaal 7)
  • Q:
    Bijdrager
    lord anubis

    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?

    Bijdrager
    mhrenes

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

    Bijdrager
    computer space

    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.

    Bijdrager
    lord anubis

    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.

    Inactief
    Anoniem

    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?

    Bijdrager
    lord anubis

    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.

    Inactief
    Anoniem

    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.

7 berichten aan het bekijken - 1 tot 7 (van in totaal 7)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.