我可以创建迭代器来创建前缀:

extension Array where Element == Int {
  func prefixesInt() -> AnyIterator<[Element]> {
    var length = 0
    return AnyIterator {
      guard length < self.count else { return nil }
      length += 1
      return Array(self.prefix(length))
    }
  }
}

for prefix in [1,10,5].prefixesInt() {
  print(prefix)  // Prints: [1]  then  [1, 10]  then [1, 10, 5]
}

现在我想通过以下方式实现与其他类型相同的功能:
1)将类型编码为int
2)使用相同的前缀函数
3)解码回原始类型
[我知道可能有其他方法可以实现这一点,但我想遵循这条路线,原因有很多,我也想了解更多。]
所以我需要:
extension Array where Element: Equatable {
  func encode() -> [Int] {
    return map { self.firstIndex(of: $0)! }
  }
}
print(["A", "B", "A", "C"].encode())  // Prints: [0, 1, 0, 3]

extension Array where Element == Int {
  func decode<Output>(_ original: [Output]) -> [Output] {
    return map { original[$0] }
  }
}
print([2,3,0].decode(["P", "Q", "R", "S"]))  // Prints: ["R", "S", "P"]

我现在可以随心所欲了:
extension Array where Element: Equatable {
  func prefixes() -> LazyMapSequence<AnyIterator<[Int]>, [Element]> {
    return encode().prefixesInt().lazy.map { $0.decode(self) }
  }
}

for prefix in ["H","A","T"].prefixes() {
  print(prefix)
}

现在我想更进一步,将转换(在本例中是前缀)转换为参数,我的尝试是:
extension Array where Element: Equatable {
  func encodeTransformDecode(transform: ([Int]) -> AnyIterator<[Int]> ) -> LazyMapSequence<AnyIterator<[Int]>, [Element]> {
    return transform(encode()).lazy.map { $0.decode(self) }
  }
}

它编译得很好,但是当我尝试:
extension Array where Element: Equatable {
  func prefixes2() -> LazyMapSequence<AnyIterator<[Element]>, [Element]> {
    return encodeTransformDecode(transform: prefixesInt) //ERROR: 'Array<Element>' is not convertible to 'Array<Int>'
  }
}

for prefix in ["A","B","C"].prefixes2() {
  print(prefix)
}

然后我得到错误指示
我卡住了。感谢任何帮助。
整个代码:
print("========== prefixesInt")
extension Array where Element == Int {
  func prefixesInt() -> AnyIterator<[Element]> {
    var length = 0
    return AnyIterator {
      guard length < self.count else { return nil }
      length += 1
      return Array(self.prefix(length))
    }
  }
}

for prefix in [1,10,5].prefixesInt() {
  print(prefix)  // Prints: [1]  then  [1, 10]  then [1, 10, 5]
}

print("============ encode")
extension Array where Element: Equatable {
  func encode() -> [Int] {
    return map { self.firstIndex(of: $0)! }
  }
}
print(["A", "B", "A", "C"].encode())  // Prints: [0, 1, 0, 3]

print("============ decode")
extension Array where Element == Int {
  func decode<Output>(_ original: [Output]) -> [Output] {
    return map { original[$0] }
  }
}
print([2,3,0].decode(["P", "Q", "R", "S"]))  // Prints: ["R", "S", "P"]

print("============ prefixes")
extension Array where Element: Equatable {
  func prefixes() -> LazyMapSequence<AnyIterator<[Int]>, [Element]> {
    return encode().prefixesInt().lazy.map { $0.decode(self) }
  }
}

for prefix in ["H","A","T"].prefixes() {
  print(prefix)
}

extension Array where Element: Equatable {
  func encodeTransformDecode(transform: ([Int]) -> AnyIterator<[Int]> ) -> LazyMapSequence<AnyIterator<[Int]>, [Element]> {
    return transform(encode()).lazy.map { $0.decode(self) }
  }
}

print("============ prefixes2")
extension Array where Element: Equatable {
  func prefixes2() -> LazyMapSequence<AnyIterator<[Element]>, [Element]> {
    return encodeTransformDecode(transform: prefixesInt)
  }
}

for prefix in ["A","B","C"].prefixes2() {
  print(prefix)
}

最佳答案

正如我的评论和您在自己的答案中所指出的,代码的核心问题是您的prefixesInt类型不正确。实例方法具有以下形式的类型:

(<object type>) -> (<argument types>) -> <return type>

传递给<object type>的值是函数中绑定到self的值。所以类型prefixesInt是:
([Int]) -> () -> AnyIterator<[Int]>

要修复代码,只需更改prefixes2
func prefixes2() -> LazyMapSequence<AnyIterator<[Int]>, [Element]>
{
   return encodeTransformDecode(transform: { $0.prefixesInt() } )
}

类型已更改为包含AnyIterator<[Int]>而不是AnyIterator<[Element]>,传递闭包{ $0.prefixesInt() }而不仅仅是prefixesInt(前者将数组作为参数,而编译器将后者传递为当前值为self.prefixesInt预绑定的闭包,后者是self的简写,即调用的selfArray<Equatable>)。
高温高压
要查看与生成的代码的连接,请考虑:
<value>.method(<args>)

只是一个缩写:
<type of value>.method(<value>)(<args>)

在这种情况下,这意味着:
$0.prefixesInt()

是:
Array<Int>.prefixesInt($0)()

这是你生产的,但分布在prefixes2prefixes())和Array<Int>.prefixesIntencodeTransformDecode)之间。通过使用速记和传递闭包,不需要对transform(encode())()进行任何更改。

关于swift - 'Array <Element>'不能转换为'Array <Int>',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53335355/

10-09 02:53