2014-09-26 24 views
5

ho provato a fare un po 'di matematica semplice layout di UIView in rapida e provato la seguente riga di codice ...Qual è il modo migliore per fare matematica con CGFloats in swift?

var offset: CGFloat = (bounds.width/2.0) - ((sortedSymptoms.count * bounds.height)/2.0) 

e ottenuto il seguente errore del compilatore:

cannot invoke '-' with an argument list of type '(($T6), ($T17))' 
     var offset: CGFloat = (bounds.width/2.0) - ((sortedSymptoms.count * bounds.height)/2.0) 
           ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  

L'errore isn compilatore è tutto ciò che è utile, ma sembra che ci sia un conflitto di tipo tra Double, Int e CGFloat di qualche tipo. Sono stato in grado di compilare la riga spargendola in alcune esplicite creazioni di CGFloats, ma non posso credere che questo sia il modo giusto per farlo.

var offset: CGFloat = (bounds.width/CGFloat(2.0)) - ((CGFloat(sortedSymptoms.count) * bounds.height)/CGFloat(2.0)) 

Qual è la strada giusta?

risposta

7

Questo è un problema noto in Swift e il team di sviluppo ha lavorato per migliorare il problema intorno a CGFloat in particolare. Ma in questo momento, sì, è così che lo scrivi.

Alcuni followup da devforums (che può farti felice o triste, ma almeno spiega all'incirca lo stato attuale): https://devforums.apple.com/message/1026028#1026028

Si noti che il problema principale è che il letterale 2.0 non costringere a CGFloat, che probabilmente dovrebbe Ma il count probabilmente richiederà sempre un cast, per intento. Non puoi sempre convertire in modo sicuro tra tipi numerici e Swift ti costringe intenzionalmente a considerare ogni volta che fai questi tipi di cast. Ma dovrebbe essere possibile determinare se una conversione letterale è sicura in fase di compilazione, quindi dovrebbe essere risolvibile.

+0

Grazie per il collegamento di Devforums, sì, questo è brutto, ma ha senso. Spero che trovino una soluzione elegante e spero che non dovremo aspettare il prossimo WWDC prima di poter iniziare a usarlo. –