Ваша проблема в том, что вы используете Dictionary
со значением, которое является массивом [Any]
, для хранения имени и функции изображения кнопки.Затем вам нужно выполнить какое-то уродливое приведение, чтобы получить что-то, что вы можете использовать:
if let funcToCall = myBtnsArr[indexPath.row].first?.value.last as? (HomeViewController) -> () -> () {
funcToCall(self)()
}
Вам будет лучше поместить это в struct
, используя надлежащие типы:
struct ButtonInfo {
let title: String
let image: String
let function: (HomeViewController) -> () -> ()
}
Примечание: Здесь определено свойство function
для хранения функции экземпляра класса HomeViewController
.При вызове функции текущий экземпляр HomeViewController
(т.е. self
) будет передан следующим образом: function(self)()
.
Затем определите ваш mainBtnsArr
следующим образом:
let mainBtnsArr = [
ButtonInfo(title: "Hotels", image: "homepage_hotel", function: ShowHotelSearch),
ButtonInfo(title: "Flights", image: "homepage_flights", function: ShowFlightSearch),
ButtonInfo(title: "Transfer", image: "homepage_transfer", function: ShowTransferSearch),
...
]
Тогда использовать данные будет намного проще.( Примечание: Поскольку функции в массиве являются функциями экземпляра, при вызове их необходимо передать self
функции):
let funcToCall = mainBtnsArr[indexPath.row].function
funcToCall(self)()
Аналогично, title
и img
стать:
let title = mainBtnsArr[indexPath.row].title
let img = mainBtnsArr[indexPath.row].image