[swift-users] Foundation on Linux `CFBooleanGetTypeID`/`CFGetTypeID`
Ryan Lovelett
swift-dev at ryan.lovelett.me
Tue May 24 15:39:14 CDT 2016
On Tue, May 24, 2016, at 04:19 PM, Tony Parker wrote:
>
>> On May 24, 2016, at 1:11 PM, Ryan Lovelett <swift-
>> dev at ryan.lovelett.me> wrote:
>>
>> On Tue, May 24, 2016, at 04:07 PM, Tony Parker wrote:
>>> Let’s get a bug into JIRA, then we’ll figure out what we should
>>> do here.
>>
>> That's the problem for me. What is the bug? Based on the code example
>> I provided in this thread. I'm somewhat convinced that the bug is
>> that Foundation on Linux/Glibc is "broken". In that it does not match
>> the behavior of Foundation on Darwin, yet it has the desired
>> behavior.
>
> What I mean is that I want to track the issue in JIRA so we don’t lose
> it, and so we can find it later when looking for issues that prevent
> fully cross-platform behavior. We can look into fixing these in
> several ways, including adding new API in both frameworks, changing
> implementations, etc.
I have filed a bug https://bugs.swift.org/browse/SR-1610
Obviously please reformat/update accordingly. This was the best I could
come up with.
>
> - Tony
>
>>
>>>
>>> - Tony
>>>
>>>> On May 24, 2016, at 1:03 PM, Jens Alfke <jens at mooseyard.com> wrote:
>>>>
>>>>
>>>>> On May 24, 2016, at 12:52 PM, Tony Parker
>>>>> <anthony.parker at apple.com> wrote:
>>>>>
>>>>> One other possibility is using the objCType property on NSNumber’s
>>>>> superclass NSValue to check.
>>>>
>>>> That doesn’t work, unfortunately, at least not with Apple’s
>>>> Foundation. NSNumbers initialized with booleans have objcType “c”
>>>> because `BOOL` is just a typedef for `char`. So the only way to
>>>> tell a boolean apart from an 8-bit int is to compare the object
>>>> pointer against the singleton true and false objects.
>>>>
>>>> Here’s a snippet of Obj-C code I use for this in my JSON encoder:
>>>>
>>>> *char* ctype = *self*.*objCType*[];
>>>> *switch* (ctype) {
>>>> *case* 'c': {
>>>> *// The only way to tell whether an NSNumber with 'char' type is a
>>>> boolean is to*
>>>> *// compare it against the singleton kCFBoolean objects:*
>>>> *if* (*self* == (*id*)*kCFBooleanTrue*)
>>>> *return* yajl_gen_bool(gen, *true*);
>>>> *else* *if* (*self* == (*id*)*kCFBooleanFalse*)
>>>> *return* yajl_gen_bool(gen, *false*);
>>>> *else*
>>>> *return* yajl_gen_integer(gen, *self*.*longLongValue*);
>>>> }
>>>>
>>>>> I haven’t seen how much of this is implemented in corelibs-
>>>>> foundation yet.
>>>> I took a peek at the Swift NSNumber and NSValue implementations on
>>>> Github, and the objcType stuff doesn’t seem to be functional. It
>>>> looks like objcType will only have a value if the object was
>>>> initialized as an NSValue with the type code passed in, not if the
>>>> typical NSNumber initializers were used.
>>>>
>>>> —Jens
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160524/bb709799/attachment.html>
More information about the swift-users
mailing list