ios - 如何在排序数组中将一行代码从 Objective-C 转换为 Swift?

标签 ios arrays objective-c swift sorting

我一直在尝试将代码行从 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

kindly check this link for the screenshot of my error

我已经在 stackoverflow 中的一位好心人的帮助下转换了这一行,这可能有助于支持需要翻译的代码

 //------------------------------
 //OBJ C TO SWIFT
 //------------------------------
 NSComparisonResult sortItem (id data1, id data2, void* context)
 {
  NSMetadataItem *item1 = data1;
  NSMetadataItem *item2 = data2;

 NSString* string1 = [[item1 valueForAttribute:NSMetadataItemURLKey]lastPathComponent];
NSString* string2 = [[item2 valueForAttribute:NSMetadataItemURLKey]lastPathComponent];

return [string1 compare:string2];
}

转换为 SWIFT

 func sortItem(_ data1: Any?, _ data2: Any?, _ context: UnsafeMutableRawPointer?) -> ComparisonResult {
    let item1 = data1 as? NSMetadataItem
    let item2 = data2 as? NSMetadataItem

    guard let string1 = item1?.value(forAttribute: NSMetadataItemURLKey) as? String else {
        return .orderedAscending
    }

    guard let string2 = item2?.value(forAttribute: NSMetadataItemURLKey) as? String else {
        return .orderedDescending
    }

    return string1.compare(string2)
}

也从 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 ?? ""))
}

sortItemsortString 已经转换。我在这里包括代码流程以供引用。

最佳答案

尝试将 ObjC 代码逐字翻译成 Swift 总是一个坏主意。

首先声明marrBackupList作为原生 Swift 数组

var marrBackupList = [NSMetadataItem]()

基本上避免使用NSArray/NSDictionary尽可能在 Swift 中。基础集合类型缺少类型信息。


swift sort(by:函数与 ObjC 比较器 非常相似,但默认情况下它是静态类型的。

这相当于 sortItem ,不像id (又名 Any )在 ObjC rhslhs是静态的 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 }) 的较短语法

关于ios - 如何在排序数组中将一行代码从 Objective-C 转换为 Swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889450/

相关文章:

java - 声明一个字符串数组

javascript - 以相同的顺序将数组元素 append 到另一个数组

objective-c - 通过 SSH 从 iOS 远程重新启动/关闭 mac?

javascript - HTML5 - 如何离线使用远程但缓存在 list 中的资源?

ios - 显示数据库中的数据 - CoreData 如何走?

c - 段错误 C(1d 数组到 2d 数组并返回)

iphone - NSTask实时监控输出

ios - 在开关 block 中使用 objectAtIndex 方法

ios - UIView Controller 高度小于原始高度swift 4

ios - SWIFT、ViewController 和展开转场到初始 ViewController