我想扩展一个UInt8值的数组,所以我在 Swift 3 中编写了这段代码:
extension Array where Element: UInt8 {
}
但我收到了这个错误:
键入'Self.Generator.Element'约束为非协议类型'UInt8'
那我该如何解决呢?
答案 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
符合有用协议UInt8
,UnsignedInteger
和Equatable
这一事实。通过使用协议组合,这些协议蓝图的所有方法都可以在扩展中的Comparable
:s中随时使用,但是将这些元素限制为符合您自己的协议Element
的类型(即仅{{1} }}):
MyType
然而,这只是协议和类型约束的一个简短课程;如果您打算在字节的上下文中使用UInt8
序列,请在他对您的问题的评论中关注@vadian:s建议。