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

快速使用协议作为数组类型和函数参数

郎正初
2023-03-14
问题内容

我想创建一个类,可以存储符合特定协议的对象。对象应存储在类型数组中。根据Swift文档协议可以用作类型:

由于它是一种类型,因此可以在允许使用其他类型的许多地方使用协议,包括:

  • 作为函数,方法或初始化程序中的参数类型或返回类型
  • 作为常量,变量或属性的类型
  • 作为数组,字典或其他容器中项目的类型

但是,以下内容会生成编译器错误:

协议“ SomeProtocol”只能用作通用约束,因为它具有“自我”或相关的类型要求

您应该如何解决这个问题:

protocol SomeProtocol: Equatable {
    func bla()
}

class SomeClass {

    var protocols = [SomeProtocol]()

    func addElement(element: SomeProtocol) {
        self.protocols.append(element)
    }

    func removeElement(element: SomeProtocol) {
        if let index = find(self.protocols, element) {
            self.protocols.removeAtIndex(index)
        }
    }
}

问题答案:

您在Swift中遇到了协议问题的一个变体,目前尚无好的解决方案。

另请参见扩展数组以检查它是否在Swift中排序?,其中包含有关如何解决该问题的建议,这些建议可能适合您的特定问题(您的问题非常笼统,也许您可​​以使用这些答案找到解决方法)。



 类似资料:
  • 问题内容: 在Objective- C中,可以将符合协议的类指定为方法参数。例如,我可以有一个只允许符合的方法: 我找不到在Swift中执行此操作的方法(也许尚不可能)。您可以使用来指定多种协议,但是您又如何要求该对象属于特定类呢? 问题答案: 您可以将其定义为通用函数,并使用类型约束来同时要求类和协议。 斯威夫特4 Swift 3 (也适用于Swift 4) 迅捷2

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

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

  • 问题内容: 我在编写以下函数作为闭包时遇到麻烦 我试过了 但这不起作用。 有什么建议? 问题答案: 我相信您要的东西没有任何意义(与Swift无关)。尽管我有兴趣证明自己是错误的,但我不认为可以用任何强类型语言合理地创建它。(编辑:继续我的研究,我相信使用一流的多态性的语言是可行的,但我不知道实际上有此功能的任何通用语言。) 您希望是哪种类型?泛型创建抽象类型。除非专业化,否则它不会成为真实类型。

  • 问题内容: ./chains.go:26:10:不能在作业中使用UpperCaseHandler(typefunc(asl.MessageDelivery))作为asl.MessageHandler类型./chains.go:37:86:无法使用RepeatHandler(类型func(asl.MessageDelivery))与Repeater.ConsumeFunc的参数中的asl.Messa

  • 我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误: