2014-11-27 18 views
22

Qui il mio codice. Sto passando due valori in CGRectMake(..) e ottenendo ed errore.come convertire il valore Int32 in CGFloat in swift?

let width = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).width 
// return Int32 value 

let height = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).height 
// return Int32 value 

myLayer?.frame = CGRectMake(0, 0, width, height) 
// returns error: '`Int32`' not convertible to `CGFloat` 

Come posso convertire Int32-CGFloat di non restituire un errore?

risposta

51

Per convertire tra i tipi di dati numerici creare una nuova istanza del tipo di destinazione, passando il valore di origine come parametro. Quindi, per convertire un Int32 ad un CGFloat:

let int: Int32 = 10 
let cgfloat = CGFloat(int) 

Nel tuo caso è possibile fare:

let width = CGFloat(CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).width) 
let height = CGFloat(CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).height) 

myLayer?.frame = CGRectMake(0, 0, width, height) 

o:

let width = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).width 
let height = CMVideoFormatDescriptionGetDimensions(device.activeFormat.formatDescription as CMVideoFormatDescriptionRef!).height 

myLayer?.frame = CGRectMake(0, 0, CGFloat(width), CGFloat(height)) 

Si noti che non v'è alcuna implicita o esplicita casting di tipo tra i tipi numerici in swift, quindi è necessario utilizzare lo stesso modello anche per convertire uno Int a Int32 o UInt ecc.

+1

Grazie funziona bene! – iosLearner

+0

Mi chiedo, è sicuro eseguire questa conversione su sistemi a 32 bit, dove 'int32' è (ancora) 32 bit, tuttavia' CGFloat' è anche a 32 bit. Tenendo conto che quest'ultimo è un punto mobile e [questa risposta] (http://stackoverflow.com/a/30260843/1492173), ci sarà una perdita di precisione. Per favore correggimi se sbaglio. –

2

Basta convertire in modo esplicito width e height al CGFloat utilizzando il CGFloat's inizializzatore:

myLayer?.frame = CGRectMake(0, 0, CGFloat(width), CGFloat(height))