Вам необходимо выполнить приведение к String, а также иметь некоторые логики c, которые определяют, что возвращается в случае сбоя приведения, вот пример
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)
}
Поскольку вы всегда выполняете приведение тогда ваши входные параметры почему бы не переписать функцию как
func sortItem(_ data1: NSMetadataItem?, _ data2: NSMetadataItem?, _ context: UnsafeMutableRawPointer?) -> ComparisonResult {
guard let item1 = data1, let string1 = item1.value(forAttribute: NSMetadataItemURLKey) as? String else {
return .orderedAscending
}
guard let item2 = data2, let string2 = item2.value(forAttribute: NSMetadataItemURLKey) as? String else {
return .orderedDescending
}
return string1.compare(string2)
}
Конечно, вам не нужно писать такой плотный код, как я сделал здесь, и иметь несколько операторов guard
или if/else
в зависимости от какие логики c вы хотите реализовать для значений nil и значений, которые не являются строками