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 1if 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 2documentations 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