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

Swift 3无法将符合协议的对象数组追加到该协议的集合中

谭俊
2023-03-14
问题内容

下面我粘贴了代码,您应该可以将这些代码粘贴到Swift 3游乐场中并查看错误。

我定义了一个协议并创建该类型的空数组。然后,我有一个符合我尝试附加到数组的协议的类,但出现以下错误。

protocol MyProtocol {
    var text: String { get }
}

class MyClass: MyProtocol {
    var text = "Hello"
}
var collection = [MyProtocol]()
var myClassCollection = [MyClass(), MyClass()]
collection.append(myClassCollection)

argument type '[MyClass]' does not conform to expected type 'MyProtocol'

请注意,集合+ = myClassCollection返回以下错误:

error: cannot convert value of type '[MyProtocol]' to expected argument type 'inout _'

这在早期的Swift版本中有效。

到目前为止,我发现的唯一解决方案是迭代每个元素并将其添加到新数组中,如下所示:

for item in myClassCollection {
    collection.append(item)
}

任何帮助表示赞赏,谢谢!

编辑

如下所示的解决方案是:

collection.append(contentsOf: myClassCollection as [MyProtocol])

真正的问题是,当您丢失“ as [MyProtocol]”时,会产生误导性的编译器错误

编译器错误为:

error: extraneous argument label 'contentsOf:' in call
collection.append(contentsOf: myClassCollection)

此错误导致用户contentsOf:从代码中删除,然后导致我首先提到的错误。


问题答案:

append(_ newElement: Element)追加一个元素。你想要的是append(contentsOf newElements: C)

但是您必须 [MyClass]数组[MyProtocol]显式 转换 为:

collection.append(contentsOf: myClassCollection as [MyProtocol])
// or:
collection += myClassCollection as [MyProtocol]

如在Swift中使用协议时在类型转换中所述,这会将每个数组元素包装到一个容纳“符合MyProtocol” 的盒子中,而不仅仅是对数组的重新解释。

编译器自动为单个值执行此操作(这就是为什么

for item in myClassCollection {
    collection.append(item)
}

编译),但不能用于数组。在早期的Swift版本中,您甚至无法使用强制转换整个数组as [MyProtocol],而必须强制转换每个单独的元素



 类似资料:
  • 问题内容: 可以说我已经创建了这个协议和几个类 现在,我想声明一个数组,其中包含符合此类协议的对象类。我该如何申报?理想情况下,我希望编译器检查数组(在编译时)是否正确填充,而不是自己在运行时(运行时)检查它。 这是我尝试的没有成功的方法:( 这会导致编译错误: ‘任何对象都没有名为’construct’的成员 由于类本身不符合协议(它们的实例符合),因此编写这种方法甚至更糟。 类型“ MyCon

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

  • 问题内容: 为什么此Swift代码无法编译? 编译器说:“类型不符合协议”(或在Swift的更高版本中,“不支持将’P’用作符合协议’P’的具体类型”。) 为什么不?某种程度上,这感觉就像是语言上的一个漏洞。我意识到问题源于将数组声明为 协议类型 的数组,但这是不合理的事情吗?我认为协议确实可以帮助提供类型分层结构之类的结构吗? 问题答案: 编辑:使用Swift还要工作18个月,Swift是另一个

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

  • 本文向大家介绍Objective-C语言符合协议,包括了Objective-C语言符合协议的使用技巧和注意事项,需要的朋友参考一下 示例 以下语法表明类使用尖括号括起来的协议。 这意味着NewClass的任何实例都将响应其接口中声明的方法,但也将为的所有必需方法提供实现NewProtocol。 一个类也可以通过用逗号分隔来遵循多个协议。 就像遵循单个协议时一样,该类必须实现每个协议的每个必需方法以

  • 问题内容: 作为学习的练习,我将在Swift中重写我的验证库。 我有一个协议定义了各个规则的外观: 关联的类型定义要验证的输入的类型(例如,字符串)。它可以是显式的或通用的。 这是两个规则: 在其他地方,我有一个函数,用于验证带有s 集合的输入: 我以为这行得通,但是编译器不同意。 在下面的例子中,即使输入是一个字符串,的是一个字符串,并且Ş 是一个String … …我收到了非常有用的错误消息: