swift - 类扩展typealias的属性类型约束

标签 swift type-constraints type-alias type-extension

任务:我需要提供一个数组扩展方法,该方法将比较原始类型符合 Equatable 的 2 个原始可表示数组,并通过重用以下代码判断数组是否包含相同的元素。

我现在拥有的:

public extension Array {
  func containsTheSameElements(as array: [Element], condition: @escaping (Element, Element) -> Bool) -> Bool {
    var localCopy = array

    let countOfUncommonElements = reduce(0) { (uncommonElementsCount: Int, item: Element) -> Int in
      if let index = localCopy.index(where: {condition(item, $0)}) {
        localCopy.remove(at: index)
        return uncommonElementsCount
      } else {
        return uncommonElementsCount + 1
      }
    }

    return countOfUncommonElements == 0 && count == array.count
  }
}

func enumComparisonClosure<T: RawRepresentable>(firstItem: T, secondItem: T) -> Bool where T.RawValue: Equatable {
  return firstItem == secondItem
}

我目前的使用方式:

class Somewhere {
  enum EnumType: String {
    case first
    case second
  }

  func method() {
    let firstArray: [EnumType] = [.first, .second]
    let secondArray: [EnumType] = [.second]

    firstArray.containsTheSameElements(as: secondArray, condition: enumComparisonClosure)
  }
}

我想如何使用它:

firstArray.containsTheSameElements(as: secondArray)

我希望如何实现它:

public extension Array {
  func containsTheSameElements<Element: RawRepresentable>(as array: [Element]) -> Bool where Element.RawValue: Equatable {
    return containsTheSameElements(as: array, condition: enumComparisonClosure)
  }
}

如何将数组的扩展“Element”类型别名限制为 RawRepresentable,RawValue 类型为 Equatable?

或者使这种比较成为可能的另一种方法是什么?

最佳答案

扩展名的约束用逗号隔开,不是 通过 &containsTheSameElements 必须采用 [T] 参数 其中 T 是具有相同 RawValueRawRepresentable 作为数组元素。

例子:

extension Array where Element: RawRepresentable, Element.RawValue: Equatable {

    func containsTheSameElements<T>(as array: [T]) -> Bool
    where T: RawRepresentable, T.RawValue == Element.RawValue
    {
        return self.count == array.count &&
            !zip(self, array).contains { $0.rawValue != $1.rawValue }
    }
}

更新:如果你只需要数组的话会更简单 同类型:

extension Array where Element: RawRepresentable, Element.RawValue: Equatable {

    func containsTheSameElements(as array: [Element]) -> Bool
    {
        return self.count == array.count &&
            !zip(self, array).contains { $0.rawValue != $1.rawValue }
    }
}

或者,重用您现有的方法:

extension Array where Element: RawRepresentable, Element.RawValue: Equatable {

    func containsTheSameElements(as array: [Element]) -> Bool
    {
        return containsTheSameElements(as: array, condition: enumComparisonClosure)
    }
}

关于swift - 类扩展typealias的属性类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43899440/

相关文章:

Swift 编译器错误 : Segmentation-fault 11 thrown when using type constraints

带有伴随对象的 Scala 类型别名

Swift:重用闭包定义(使用类型别名)

swift - 无效的 Swift 支持 - SwiftSupport 文件夹丢失

ios - Swift UIView 内存使用和处理许多 subview

ios - 如何在 Swift 中更改 PageViewController 点的位置?

Typescript 对类型参数类的泛型约束

swift - 如何为不符合特定协议(protocol)的所有类型扩展通用类?

julia - 自定义类型别名的 TypeError typeassert

ios - 如何在 Swift 中初始化 AWSCognitoIdentityUserAttributeType?