Есть множество способов решить эту проблему, один из самых простых, но не самый лучший, это массив действий
например:
import UIKit
import Foundation
typealias closure = ()->()
extension Collection {
subscript (safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
struct ListOfAction {
private var list: Array<Array<closure>>
init() {
self.list = [[]]
}
mutating func append(_ at: IndexPath,method:@escaping closure) {
self.list[at.section].append(method)
}
mutating func insert(_ at: IndexPath,method:@escaping closure) {
self.list[at.section].insert(method, at: at.row)
}
func call(at:IndexPath) {
self.list[safe: at.section]?[safe: at.row]?()
}
func getClosure(at: IndexPath) -> closure? {
return self.list[safe: at.section]?[safe: at.row]
}
}
var listOfAction = ListOfAction()
var idx = IndexPath(row: 0, section: 0)
listOfAction.append(idx) {
print("hello World")
}
listOfAction.insert(IndexPath(row: 1, section: 0)) {
print("bye World")
}
listOfAction.call(at: IndexPath(row: 1, section: 0))
listOfAction.getClosure(at: idx)?()
примечание: в первую очередь вы должны заботиться о безопасности индекса;
во-вторых, вы должны изменить ответ на основе ваших требований, чтобы стать неизменным или что-то еще.
лучший способ - использовать универсальные методы.