Есть несколько способов сделать это ...
Используйте switch
для восстановления типа
Swift должен знать во время компиляции , какую перегруженную функцию он вызывает. Это не может произойти, если Swift не знает во время компиляции, какой тип переменной он имеет.
Чтобы получить информацию о типе, вы можете использовать switch
для восстановления типа:
func performCommand(_ command:Command) {
guard let todoCommand = command as? ToDoCommand else {
return
}
// Perform some tasks that are common to all ToDoCommands...
switch todoCommand {
case let command as AddToDoCommand:
performCommand(command)
case let command as EditToDoCommand:
performCommand(command)
default: break
}
}
Использовать полиморфизм
Чтобы позволить Swift решить, какую команду performToDoCommand()
запустить во время выполнения, можно использовать полиморфизм .
Добавьте требование для реализации func performToDoCommand()
к протоколу ToDoCommand
, а затем выполните это для каждого struct
, который соответствует ToDoCommand
. Позвонить правильно, тогда просто ...
protocol Command {}
protocol ToDoCommand : Command {
func performToDoCommand()
}
protocol UserCommand : Command {}
struct AddToDoCommand : ToDoCommand {
func performToDoCommand() {
print("Add ToDo")
}
}
struct EditToDoCommand : ToDoCommand {
func performToDoCommand() {
print("Edit ToDo")
}
}
struct AddUserCommand : UserCommand {}
struct EditUserCommand : UserCommand {}
class ToDoManager {
func performCommand(_ command:Command) {
guard let todoCommand = command as? ToDoCommand else {
return
}
todoCommand.performToDoCommand()
}
}