gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:19:23 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com