Как преобразовать строку кода из Objective- C в Swift в массиве сортировки? - PullRequest
0 голосов
/ 24 января 2020

Я пытался преобразовать строки кода из Objective- C в Swift в сортировке массив . Коды, которые я конвертирую, это наше существующее приложение в Objective- C, которое нужно конвертировать в Swift. Как мне перевести приведенные ниже коды на Swift?

Это код, который мне нужно перевести на Swift

[marrBackupList sortUsingFunction:sortItem context: nil];
[txtList sortUsingFunction:sortString context: nil];

Это то, что у меня было, когда Я преобразовал его в Swift

  marrBackupList = marrBackupList?.sortedArray(sortItem, context: nil) as? [AnyHashable] ?? marrBackupList
  txtList = (txtList as NSArray).sortedArray(sortString, context: nil) as? [AnyHashable] ?? txtList

пожалуйста, проверьте эту ссылку на скриншот моей ошибки

Я преобразовал эту строку уже с помощью хорошего самаритянина здесь в stackoverflow, который может помочь поддержать код, который нужно перевести Также преобразуется из Obj- C в Swift

  //---------------------------------
  //OBJ C TO SWIFT
  //----------------------------------
NSComparisonResult sortString (id data1, id data2, void* context)
{
NSString* string1 = data1;
NSString* string2 = data2;

return [string1 compare:string2];
}

Преобразовано в SWIFT

 func sortString(_ data1: Any?, _ data2: Any?, _ context: UnsafeMutableRawPointer?) -> ComparisonResult {
    let string1 = data1 as? String
    let string2 = data2 as? String

    return (string1!.compare(string2 ?? ""))
}

sortItem и sortString уже преобразовано , Я включил сюда для справки для потока кодов.

1 Ответ

2 голосов
/ 24 января 2020

Попытка перевести код Obj C буквально в Swift всегда плохая идея.

Прежде всего объявляйте marrBackupList как собственный массив Swift

var marrBackupList = [NSMetadataItem]()

В основном избегайте использования NSArray/NSDictionary в Swift, насколько это возможно. Типы базовых коллекций не содержат информации о типах.


Функция Swift sort(by: очень похожа на Obj C компаратор , но по умолчанию она набирается c.

Это эквивалент sortItem, в отличие от id (он же Any) в Obj C rhs и lhs stati c NSMetadataItemURLKey. Синтаксис расширенный необходим для обработки дополнительных опций.

marrBackupList.sort { (lhs, rhs) -> Bool in
    guard let lURL = lhs.value(forAttribute: NSMetadataItemURLKey) as? URL,
        let rURL = rhs.value(forAttribute: NSMetadataItemURLKey) as? URL else { return false }
    return lURL.lastPathComponent < rURL.lastPathComponent
}

sort{ ... } - это синтаксис завершающего замыкания sort(by: { ... })


Для сортировки не -опциональный массив строк

var txtList = [String]()

намного проще, просто укажите оператор < для возрастания или > для убывания.

Это эквивалент sortString, довольно чисто не так ли?

txtList.sort(by: <)

sort(by: <) - это более короткий синтаксис sort(by: {$0 < $1}), который является более коротким синтаксисом sort(by: {lhs, rhs -> Bool in return lhs < rhs })

...