Friday, 15 April 2011

core motion - Check NSError code in swift -



core motion - Check NSError code in swift -

i'm trying check error code value in swift, , find myself bit confused new struct types , conversions.

what want take nserror object passed in handler closure , check code type comparing value stored in cmerror struct. in objective-c write

[pedometer querypedometerdatafromdate:now todate:now withhandler:^(cmpedometerdata *pedometerdata, nserror *error) { bool isauthorized = (error.code != cmerrormotionactivitynotauthorized); }];

in swift, when write expect equivalent

pedometer.querypedometerdatafromdate(now, todate: now) {(data:cmpedometerdata!, error:nserror!) in allow isauthorised:bool = (error.code != cmerrormotionactivitynotauthorized) }

i error could not find overload '!=' accepts supplied arguments. points type cast error. , indeed cmerrormotionactivitynotauthorized of type cmerror, swift struct. , can't seem convert between cmerror type , int type of error.code.

so how can check error code?

note 1

if seek decompose , explicitly cast:

let errorcode:int = (cmerrormotionactivitynotauthorized int) allow isauthorized:bool = (error.code != errorcode)

i absurd error message cannot convert expression's type 'int' type 'int'.

note 2

documentations says cmerror defined as

struct cmerror { init(_ value: cunsignedint) var value: cunsignedint }

in swift. in objective-c defined as

typedef enum { cmerrornull = 100, cmerrordevicerequiresmovement, cmerrortruenorthnotavailable, cmerrorunknown, cmerrormotionactivitynotavailable, cmerrormotionactivitynotauthorized, cmerrormotionactivitynotentitled, cmerrorinvalidparameter } cmerror;

jack wu's comments right — looks non-modernized enum, , filing bug that great idea. in meantime...

command-click cmerror declaration in swift file , you'll swift definition of both type , related constants. cmerrormotionactivitynotauthorized , friends aren't subtype of int, they're instances of cmerror struct, contains integer value. value cunsignedint, , swift doesn't automatically convert signed int — part of swift beingness "safe" language avoiding situations implicit type conversions can lead over/underflows cause bugs.

so, query should this:

pedometer.querypedometerdatafromdate(now, todate: now) { data, error in allow isauthorized = (error.code != int(cmerrormotionactivitynotauthorized.value)) }

(also slimmed code bit utilize type inference.)

swift core-motion nserror

No comments:

Post a Comment