gpt4 book ai didi

swift - 当只有符合较小类型的变量时如何调用重载函数?

转载 作者:搜寻专家 更新时间:2023-10-31 08:28:01 28 4
gpt4 key购买 nike

在给定符合每个重载参数的公共(public)协议(protocol)的变量的情况下,Swift 是否有办法正确推断要调用哪个重载函数?

在下面的代码示例中,我希望能够将类型为 Command 的通用对象传递给许多可能能够处理它的其他对象。

但是,当一个对象向下转换为基本协议(protocol)时,类型信息就会“丢失”。这使我无法根据命令类型使用函数重载。

有没有办法“返回”该类型信息,以便 Swift 有足够的信息来正确调用适当的函数?

protocol Command {}
protocol ToDoCommand : Command {}
protocol UserCommand : Command {}

struct AddToDoCommand : ToDoCommand {}
struct EditToDoCommand : ToDoCommand {}

struct AddUserCommand : UserCommand {}
struct EditUserCommand : UserCommand {}

class ToDoManager {
func performCommand(_ command:Command) {
guard let todoCommand = command as? ToDoCommand else {
return
}

// Perform some tasks that are common to all ToDoCommands...

// This produces a compiler error because 'todoCommand' is of
// type ToDoCommand, which is not specific enough for Swift
// to deduce which overloaded function to call. Can this
// be overcome?

performToDoCommand(todoCommand)
}

func performToDoCommand(_ command:AddToDoCommand) {
print("Add ToDo")
}

func performToDoCommand(_ command:EditToDoCommand) {
print("Edit ToDo")
}
}

class UserManager {
func performCommand(_ command:Command) {
guard let userCommand = command as? UserCommand else {
return
}

// Perform some tasks that are common to all UserCommands...

// See note above...
performUserCommand(userCommand)
}

func performUserCommand(_ command:AddUserCommand) {
print("Add User")
}

func performUserCommand(_ command:EditUserCommand) {
print("Edit User")
}

}

let todoManager = ToDoManager()
let userManager = UserManager()

let command = AddUserCommand()
todoManager.performCommand(command)
userManager.performCommand(command)

最佳答案

有几种方法可以解决这个问题......

使用开关重新建立类型

Swift 需要在编译时知道它正在调用哪个重载函数。如果 Swift 在编译时不知道它拥有哪种类型的变量,这就不会发生。

要取回类型信息,可以使用开关重新建立类型:

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 协议(protocol),然后为符合 的每个struct 实现它>ToDo 命令。调用正确的方法很简单...

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()
}
}

关于swift - 当只有符合较小类型的变量时如何调用重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56996943/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com