当前位置: 首页 > 面试题库 >

在Swift中将符合协议的类作为函数参数

楚浩然
2023-03-14
问题内容

在Objective-
C中,可以将符合协议的类指定为方法参数。例如,我可以有一个只允许UIViewController符合的方法UITableViewDataSource

- (void)foo:(UIViewController<UITableViewDataSource> *)vc;

我找不到在Swift中执行此操作的方法(也许尚不可能)。您可以使用来指定多种协议func foo(obj: protocol<P1, P2>),但是您又如何要求该对象属于特定类呢?


问题答案:

您可以将其定义foo为通用函数,并使用类型约束来同时要求类和协议。

斯威夫特4

func foo<T: UIViewController & UITableViewDataSource>(vc: T) {
    .....
}

Swift 3 (也适用于Swift 4)

func foo<T: UIViewController>(vc:T) where T:UITableViewDataSource { 
    ....
}

迅捷2

func foo<T: UIViewController where T: UITableViewDataSource>(vc: T) {
    // access UIViewController property
    let view = vc.view
    // call UITableViewDataSource method
    let sections = vc.numberOfSectionsInTableView?(tableView)
}


 类似资料:
  • 问题内容: 在Objective-C中,我知道如何传递as参数: 但是在Swift中没有更多类型了。 如何在不知道是哪个的情况下将协议作为参数传递? 问题答案: 在您的评论之一中,您说: “我想创建一个方法,该方法返回实现所需协议的类类型的数组。” 您是否尝试过以下方法: 然后使用上述结构: 起作用的棘手部分是“ @objc”,它将协议暴露给目标c运行时,并允许我们传递任何“协议类型”作为参数。

  • 问题内容: 尝试符合Swift UIViewController子类中的UITableViewDataSource和UITableViewDelegate。 文件说,你应该在符合行后但那通常在超去。另一个不起作用。在超类之后使用逗号分隔的列表也不起作用 编辑: 还必须采用每种协议的所有必需方法,而我最初并未这样做。 问题答案: 您使用逗号: 但是要意识到,超类必须是逗号分隔列表中的第一项。 如果您

  • 问题内容: 我想让一个函数在Swift中接受任何数字(Int,Float,Double,…) 不使用NSNumber 问题答案: 更新: 以下答案原则上仍然适用,但是Swift 4完成了数字协议的重新设计,因此通常不需要添加自己的数字协议。在构建自己的系统之前,请查看标准库的数字协议。 在Swift中,这实际上是不可能的。为此,您需要创建一个新协议,并使用您将在泛型函数中使用的任何方法和运算符进行

  • 问题内容: 下面我粘贴了代码,您应该可以将这些代码粘贴到Swift 3游乐场中并查看错误。 我定义了一个协议并创建该类型的空数组。然后,我有一个符合我尝试附加到数组的协议的类,但出现以下错误。 请注意,集合+ = myClassCollection返回以下错误: 这在早期的Swift版本中有效。 到目前为止,我发现的唯一解决方案是迭代每个元素并将其添加到新数组中,如下所示: 任何帮助表示赞赏,谢谢

  • 问题内容: 我试图在我快速编写的类上使用NSCoding协议,但是似乎无法弄清楚为什么当我实现所需的方法时,编译器会抱怨它“不符合协议NSCoding”: 这是一个错误还是我只是缺少一些东西? 问题答案: 如您在报告导航器中详细的编译器消息中所见,您的方法未正确声明: (在beta版本之间可能有所变化。)此外,该方法必须标记为: 在 Swift 3中 ,所需的方法是

  • 我必须将一个协议作为参数传递给一个函数。协议是泛型的,具有关联的类型。我找不到一个好办法。 我想要实现的基本上是在JSON中存储一个键值对。所以我有一个通用的数据类型协议,它设置/获取值(根据数据类型设置和获取) 在另一个协议中,我希望将这个泛型数据类型协议作为函数参数传递。 在下面的代码中,我得到的协议“dataType”只能用作泛型约束,因为它有自身或关联的类型要求