我一直在尝试在排序数组中将代码行从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 ?? ""))
}
sortItem
和sortString
已经转换。我在这里包括以供代码流程参考。
尝试将 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 })
语法