Re: NSNumber : method to return pointer to represented value
Re: NSNumber : method to return pointer to represented value
- Subject: Re: NSNumber : method to return pointer to represented value
- From: "email@hidden" <email@hidden>
- Date: Sat, 22 Feb 2014 12:58:02 +0000
On 22 Feb 2014, at 08:32, Ken Thomases <email@hidden> wrote:
> There's no one representation of an NSNumber's content.
I think that this is the foundation of things.
What there is is a reported representation as given by -objCType.
The docs say, as I am sure you know:
“
NSNumber
objCType
Returns a C string containing the Objective-C type of the data contained in the receiver.
- (const char *)objCType
Return Value
A C string containing the Objective-C type of the data contained in the receiver, as encoded by the @encode() compiler directive.
“
Now I don’t care know how NSNumber persists its value nor with what type it was initialised. What I do care about in this case is what -objCType returns.
If I create a NSNumber like so:
NSNumber *n = @((int)5);
Then [n objCType] returns “i”.
From this I conclude that the canonical/reported representation is an int and I proceed accordingly.
And that’s all that I require.
The Mono method declares I need a pointer to an int.
If my Obj-C argument id object says, yes, I have a canonical/reported int and provide a pointer to such, then we are good to go.
I can define a complex number class.
MYComplexNumber * cn = [MYComplexNumber complexNumberWithString:@“5,2"];
This can return “i” for -objCType and that’s okay.
Now if I initialise it with @“5.5,2” -objCType may respond with “f”.
Now that is not okay. I have a unexpected type but this is something that I can detect and handle, likely by raising an exception.
> Keep in mind that NSDecimalNumber is-a NSNumber
Your point about NSNumber subclasses such as NSDecimaNumber is well made and a case in point.
It turns out that NSDecimaNumber returns “d” for double.
My category will produce a pointer to a double representation of the NSDecimaNumber.
And that’s okay.
NSDecimaNumber instances can safely(!!) be used as arguments to Mono methods that take a double parameter.
My actual working solution for decimals is to use an intermediate string representation to transfer data between Cocoa and the MONO CLR.
Your point is correct though and the class cluster nature of NSNumber makes things more interesting.
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[])
{
NSNumber *n = [NSNumber numberWithInt:5];
NSLog(@"[[NSNumber numberWithInt:5] objCType] = %s", [n objCType]);
NSLog(@"[@((int)5) objCType] = %s", [@((int)5) objCType]);
NSLog(@"[@((char)5) objCType] = %s", [@((char)5) objCType]);
NSLog(@"[@((float)5) objCType] = %s", [@((float)5) objCType]);
// from NSDecimalNumber.h
// - (const char *)objCType NS_RETURNS_INNER_POINTER;
// return 'd' for double
NSDecimalNumber *dn1 = [NSDecimalNumber decimalNumberWithString:@"1.0"];
NSLog(@"[dn1 objCType] = %s", [dn1 objCType]);
NSDecimalNumber *dn2 = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:0 isNegative:NO];
NSLog(@"[dn1 objCType] = %s", [dn2 objCType]);
// simple subclass detection fails on a class cluster
if ([[n class] isSubclassOfClass:[NSNumber class]]) NSLog(@"n has invalid subclass");
if ([[dn1 class] isSubclassOfClass:[NSNumber class]]) NSLog(@"dn1 has invalid subclass");
// direct subclass detection is okay
NSLog(@"dn1 class: %@", [dn1 class]);
return 0;
}
Regards
Jonathan
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden