如何制作通用的序列过滤器包装器?过滤器包含与Set和Array类型相同的块

时间:2018-10-30 00:16:35

标签: swift generics swift-extensions

我有SetArray中的MyTypeSequences两个地方。

在这些地方,我需要过滤filter,并且您会注意到两种Sequence类型的Sequence块是相同的。

有什么方法可以实现泛型filterFor扩展,其中Set方法将返回正确的类型(Arrayextension Set where Element: MyType { func filterFor(valueToMatch:String) -> Set<MyType> { return self.filter{ $0.myProperty.caseInsensitiveCompare(valueToMatch) == .orderedSame } } } extension Array where Element: MyType { func filterFor(valueToMatch:String) -> [MyType] { return self.filter{ $0.myProperty.caseInsensitiveCompare(valueToMatch) == .orderedSame } } } ),具体取决于接收者?

import * as StepFunctions from "aws-sdk/clients/stepfunctions";

   let sf = new StepFunctions({apiVersion: '2016-11-23'});
   var request: GetExecutionHistoryInput = {
       executionArn: executionArn,
       maxResults: 1000,
       reverseOrder: false
   }

   sf.getExecutionHistory(request).promise()

1 个答案:

答案 0 :(得分:1)

不幸的是,没有。 Set具有filter(_:)的两个重载,具有以下类型:

  1. func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]
  2. func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> Set<Self.Element>

第一个是满足Sequence符合性要求的实现。后者只是Set实现的一种方法,与任何协议无关。

没有通用的方法来引用Filter的变体,该变体返回Array<Self.Element>以外的任何内容。有一个Swift Evolution提案可以解决此问题(SE-0174 - Change filter to return an associated type)。它已被接受,但尚未实现。