Как вы анализируете входящий словарь в замыканиях? У меня ошибка: Значение типа '(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
}
Обратите внимание, что словарь на самом деле не нужен, вместо этого вы можете позволить функции возвращать массив для всех чисел, которые должны быть включены, что подразумеваетtrue
value или пропустить всю коллекцию вместе и иметь функцию, которая напрямую возвращает 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