Как преобразовать target-c `sortedArrayUsingSelector: NSSelectorFromString` в swift? - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь преобразовать target-c code to swift and got stuck on this line ofjective-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:))

Невозможно преобразовать значениетипа 'Селектор' для ожидаемого типа аргумента '(Любой, Любой) throws -> Bool'

Contacts.nameOfContactCompare находится в objective-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")];

Почему не для быстрого?

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Вы можете отсортировать ваш массив по свойству следующим образом:

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

.lowercased () должен убедиться, что регистр не учитывается.

1 голос
/ 08 октября 2019

заменить NSSelectorFromString("string") на #selector(string) или #selector(SomeClass.string)

Как мы используем NSSelectorFromString в swift?

...