Как исправить Невозможно преобразовать значение типа 'AnyObject' в ожидаемый тип аргумента '_?' ошибка? - PullRequest
0 голосов
/ 23 января 2020

У меня есть этот код, который должен сортировать элементы, но, к сожалению, я столкнулся с ошибкой Cannot convert the value of type 'AnyObject' to expected argument type '_?'. Когда я пытался щелкнуть предлагаемое решение, он говорит, что мне нужно ввести _, но я не знаю, что я вставлю. Пожалуйста, помогите мне решить эту проблему. Я искал решение здесь, в StackOverflow, но какое-то решение не применимо к моей проблеме. Надеюсь, вы могли бы помочь мне. Спасибо

error

func sortItem(_ data1: Any?, _ data2: Any?, _ context: UnsafeMutableRawPointer?) -> ComparisonResult {
    let item1 = data1 as? NSMetadataItem
    let item2 = data2 as? NSMetadataItem

    let string1 = (item1?.value(forAttribute: NSMetadataItemURLKey) as AnyObject)
    let string2 = (item2?.value(forAttribute: NSMetadataItemURLKey) as AnyObject)

    return (string1?.compare(string2 ?? ""))
}

Ответы [ 2 ]

0 голосов
/ 23 января 2020

вам нужно преобразовать string1 в String, а не AnyObject

 func sortItem(_ data1: Any?, _ data2: Any?, _ context: UnsafeMutableRawPointer?) -> ComparisonResult {
        let item1 = data1 as? NSMetadataItem
        let item2 = data2 as? NSMetadataItem

        let string1 = (item1?.value(forAttribute: NSMetadataItemURLKey) as! String)
        let string2 = (item2?.value(forAttribute: NSMetadataItemURLKey) as! String)

        return (string1?.compare(string2 ?? ""))
    }
0 голосов
/ 23 января 2020

Вам необходимо выполнить приведение к 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 и значений, которые не являются строками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...