Как вы анализируете входящий словарь в замыканиях? У меня ошибка: Значение типа '(Int) -> [Int: Bool]' не имеет индексов

Я не могу найти решение своей идеи. Я получаю сообщение об ошибке. Я хотел бы создать большую функцию, которая принимает массив для изменения, например[1,2,3,42,342,34,3,3,2,4,5,2,3], список с правильными номерамиlistToFind = [1,2,3,4], и внутреннюю функцию. Внутренняя функция создает словарь сlistToFindи возвращает его в большую функцию, где я хочу перебрать массив, проверяя,i(значение) находится в словаре.

Я получаю сообщение об ошибке:

"Значение типа '(Int) -> [Int: Bool]' не имеет индексов"

послеif someFunc[i] != nil {

      func myFuncBig (arrayToChange: [Int], listToTakeToFind: [Int], someFunc: (Int) -> [Int:Bool]) -> [Int] {
    var sortedList = [Int]()

    for i in arrayToChange {
        if someFunc[i] != nil {     
            sortedList.append(i)
        }
    }
    return sortedList
}
      func createDict (array: [Int]) -> [Int:Bool] {
    var dictToReturn = [Int: Bool]()
    
    for item in array {
        dictToReturn[item] = true
    }
    return dictToReturn
}

Непонятно, как вернуть словарь и найти в нем значение по ключу, т.к.dict[i]работает без замыканий.

2 ответа

Во-первых, у вас опечатка, так что параметр должен быть([Int]) -> [Int:Bool]и тогда вам нужно использовать эту функцию только один раз и вернуть результат в локальную переменную. Наконец, вы используете эту переменную, чтобы проверить, следует ли включать число.

      func myFuncBig (arrayToChange: [Int], listToTakeToFind: [Int], someFunc: ([Int]) -> [Int:Bool]) -> [Int] {
    var sortedList = [Int]()

    let dictionary = someFunc(listToTakeToFind)
    for i in arrayToChange {
        if let flag = dictionary[i], flag {
            sortedList.append(i)
        }
    }
    return sortedList
}

Обратите внимание, что словарь на самом деле не нужен, вместо этого вы можете позволить функции возвращать массив для всех чисел, которые должны быть включены, что подразумеваетtruevalue или пропустить всю коллекцию вместе и иметь функцию, которая напрямую возвращает true или false, если заданное число должно быть включено.

Наконец, с внедрениемsomeFuncу вас в вопросе это могло быть написано как

      array.filter(listToFind.contains)

someFuncэто функция, которая принимаетIntи возвращает словарь, так и должно бытьsomeFunc(i).

Попробуй это:

      func myFuncBig (arrayToChange: [Int], listToTakeToFind: [Int], someFunc: (Int) -> [Int:Bool]) -> [Int] {
    var sortedList = [Int]()

    for i in arrayToChange {
        if !someFunc(i).isEmpty {  // <-- here
            sortedList.append(i)
        }
    }
    return sortedList
}

В качестве альтернативы вы можете использовать:if someFunc(i)[i] != nil

Другие вопросы по тегам