Search code examples
objective-ccocoanstableviewipv4nssortdescriptor

Sorting a NSTableView column with IPv4 addresses


I want to sort an NSTableView column with IPv4 addresses using an SortDescriptor. This I have so far:

NSArray *devicesSortDescriptor = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"ip" ascending:YES comparator:^NSComparisonResult(id ipstring1, id ipstring2) {
        const char * ipch1 = [ipstring1 cStringUsingEncoding:NSASCIIStringEncoding];
        const char * ipch2 = [ipstring2 cStringUsingEncoding:NSASCIIStringEncoding];
        struct in_addr ip1, ip2;

        inet_aton(ipch1, &ip1);
        inet_aton(ipch2, &ip2);

        if (ip1.s_addr > ip2.s_addr)
            return NSOrderedDescending;
        else if (ip1.s_addr == ip2.s_addr)
            return NSOrderedSame;
        else
            return NSOrderedAscending;
    }]];

And this is the result:

strange sorted IPv4s

What am I doing wrong? I mean if ip1.s_addr > ip2.s_addr then its of cause NSOrderedDescending.. o_O

Thank you!


Solution

  • I just found out, that all you need is a numeric comparator:

    Objective-C:

    comparator:^(NSString *a, NSString *b) {
            return [a compare:b options:NSNumericSearch];
        }   
    

    Swift:

    comparator: {
            (a, b) -> NSComparisonResult in
    
            let result = a.compare(b as! String, options: NSStringCompareOptions.NumericSearch)
            return result
        }
    

    :)