Swift:任何类型的序列作为函数参数
发布时间:2020-12-14 02:28:43 所属栏目:百科 来源:网络整理
导读:我创建了自定义序列类型,我希望函数接受任何类型的序列作为参数. (我想要使用两个集合,以及我的序列类型) 像这样的东西: private func _addToCurrentTileset(tilesToAdd tiles: SequenceType) 有什么方法可以做到吗? 这似乎相对简单,但我无法以某种方式解
我创建了自定义序列类型,我希望函数接受任何类型的序列作为参数. (我想要使用两个集合,以及我的序列类型)
像这样的东西: private func _addToCurrentTileset(tilesToAdd tiles: SequenceType) 有什么方法可以做到吗? 这似乎相对简单,但我无法以某种方式解决它. Swift工具链告诉我: 我可以消除associatedType要求,但不能取消Self: protocol EnumerableTileSequence: SequenceType { associatedtype GeneratorType = geoBingAnCore.Generator associatedtype SubSequence: SequenceType = EnumerableTileSequence } 现在如果说我可以消除自我要求,那么已经使用这样的协议定义其他collectionType实体,如数组,集合将不符合它. 参考: public class Enumerator<T> { public func nextObject() -> T? { RequiresConcreteImplementation() } } extension Enumerator { public var allObjects: [T] { return Array(self) } } extension Enumerator: SequenceType { public func generate() -> Generator<T> { return Generator(enumerator: self) } } public struct Generator<T>: GeneratorType { let enumerator: Enumerator<T> public mutating func next() -> T? { return enumerator.nextObject() } }
编译器告诉你答案:“协议’序列’只能用作通用约束,因为它具有自我或相关的类型要求”.
因此,您可以使用泛型来执行此操作: private func _addToCurrentTileset<T: Sequence>(tilesToAdd tiles: T) { ... } 这将允许您将符合Sequence的任何具体类型传入您的函数. Swift将推断具体类型,允许您在不丢失类型信息的情况下传递序列. 如果要将序列中元素的类型限制为给定协议,可以执行以下操作: private func _addToCurrentTileset<T: Sequence>(tilesToAdd tiles: T) where T.Element: SomeProtocol { ... } 或者具体类型: private func _addToCurrentTileset<T: Sequence>(tilesToAdd tiles: T) where T.Element == SomeConcreteType { ... } 如果您不关心序列本身的具体类型(用于将它们混合在一起并且在大多数情况下存储它们),那么Anton’s answer已经为您提供了类型擦除版本的Sequence. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |