Swift扩展UInt8阵列

时间:2016-11-20 12:18:25

标签: arrays swift uint8array

我想扩展一个UInt8值的数组,所以我在 Swift 3 中编写了这段代码:

extension Array where Element: UInt8  {

}

但我收到了这个错误:

键入'Self.Generator.Element'约束为非协议类型'UInt8'

那我该如何解决呢?

1 个答案:

答案 0 :(得分:3)

语法Element: X表示您希望在由Element定义的X上设置类型约束,其中X必须是协议或类{ {1}}是派生的。作为一种解决方法,如果您想构建Element的扩展,该扩展仅适用于具有(值类型)元素Array的数组,则可以定义仅UInt8符合的协议,并将此协议用作扩展中的类型约束。 E.g。

UInt8

在其当前实现中,扩展中的任何代码都不知道protocol MyType {} extension UInt8: MyType {} extension Array where Element: MyType { // ... } 类型的内容,而不是Element协议中蓝图的内容(即,当前,没有)。根据您希望通过扩展程序实现的目标,您可以向MyType添加蓝图,这些蓝图已经由MyType可用的实施已经实现,例如一些初始化器。但更合理的方法是利用UInt8符合有用协议UInt8UnsignedIntegerEquatable这一事实。通过使用协议组合,这些协议蓝图的所有方法都可以在扩展中的Comparable:s中随时使用,但是将这些元素限制为符合您自己的协议Element的类型(即仅{{1} }}):

MyType

然而,这只是协议和类型约束的一个简短课程;如果您打算在字节的上下文中使用UInt8序列,请在他对您的问题的评论中关注@vadian:s建议。