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



我一直在尝试在排序数组中将代码行从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

请检查此链接以获取我的错误屏幕截图

我已经在堆栈溢出中一位好撒玛利亚人的帮助下转换了这一行,这可能有助于支持需要翻译的代码

//------------------------------
//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]()

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


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

这相当于sortItem,不像 ObjCrhs中的id(又名Any(,lhs是静态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 })语法

最新更新