首页 > 解决方案 > 如何将objective-c`sortedArrayUsingSelector:NSSelectorFromString`转换为swift?

问题描述

我试图转换objective-c code toswiftobjective and got stuck on this line of-c`代码:

NSArray *array = [[[InternalContactsHandler sharedBuffer] contacts] sortedArrayUsingSelector:NSSelectorFromString(@"string:")];

我尝试使用以下方法做类似的事情swift

var array = InternalContactsHandler.sharedBuffer()?.contacts()?.sorted(by: NSSelectorFromString("string"))

但我收到以下错误:

Cannot convert value of type 'Selector' to expected argument type '(Any, Any) throws -> Bool'

不知道它想让我扔什么或如何在代码中正确编写它。有任何想法吗?

编辑 尝试使用#selector代码产生相同的结果:

var tempData = InternalContactsHandler.sharedBuffer()?.contacts()?.sorted( by: #selector(Contact.nameOfContactCompare:))

无法将“选择器”类型的值转换为预期的参数类型“(任何,任何)抛出 - > Bool”

Contacts.nameOfContactCompareobjective-C里面,看起来像这样:

-(NSComparisonResult)nameOfContactCompare:(Contact*)c{

    NSString *f1 = [firstName stringByTrimmingCharactersInSet:    [NSCharacterSet whitespaceCharacterSet]];
    NSString *l1 = [lastName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    NSString *f2 = [c.firstName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSString *l2 = [c.lastName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    if (ABPersonGetSortOrdering() == kABPersonSortByFirstName) {
        return [self sortPrio1contact1:f1 prio2c1:l1 prio3c1:company prio1c2:f2 prio2c2:l2 prio3c2:c.company];
    } else {
        return [self sortPrio1contact1:l1 prio2c1:f1 prio3c1:company prio1c2:l2 prio2c2:f2 prio3c2:c.company];
    }
}

我已经在.h文件中添加了这样的函数,以便它可以用于swift

-(NSComparisonResult)nameOfContactCompare:(Contact*)c;

objective-c代码有效:

NSArray *array = [[[InternalContactsHandler sharedBuffer] contacts] sortedArrayUsingSelector:NSSelectorFromString(@"nameOfContactCompare")];

为什么不快速?

标签: arraysobjective-cswiftselector

解决方案


您可以像这样按属性对数组进行排序:

yourArray = yourArray.sort({ $0.yourString.lowercased() < $1.yourString.lowercased() })

.lowercased() 是为了确保不考虑区分大小写。


推荐阅读