我一直在尝试将代码行从 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 ?? ""))
}
sortItem
和 sortString
已经转换。我在这里包括代码流程以供引用。
最佳答案
尝试将 ObjC 代码逐字翻译成 Swift 总是一个坏主意。
首先声明marrBackupList
作为原生 Swift 数组
var marrBackupList = [NSMetadataItem]()
基本上避免使用NSArray/NSDictionary
尽可能在 Swift 中。基础集合类型缺少类型信息。
swift sort(by:
函数与 ObjC 比较器 非常相似,但默认情况下它是静态类型的。
这相当于 sortItem
,不像id
(又名 Any
)在 ObjC rhs
和 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 })
的较短语法
关于ios - 如何在排序数组中将一行代码从 Objective-C 转换为 Swift?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889450/