'Array<Element>' 不能转换为 'Array<Int>'

阿达胡斯

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

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)
}
CRD

正如我的评论中所指出的,并且您已经在自己的答案中进行了探索,代码中的核心问题是您的类型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() } )
}

类型已更改为 includeAnyIterator<[Int]>而不是AnyIterator<[Element]>并且{ $0.prefixesInt() }传递了一个闭包而不是仅仅传递prefixesInt(前者将数组作为参数,而编译器将后者传递给 ,后者是 的简写self.prefixesInt,作为具有selfpre-bound当前值的闭包- 即selfArray<Equatable> prefixes2称为)。

HTH


要查看与您生成的代码的联系,请考虑:

<value>.method(<args>)

只是以下内容的简写:

<type of value>.method(<value>)(<args>)

在这种情况下,这意味着:

$0.prefixesInt()

是以下的简写:

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

这是你生产的,但分布在prefixes()( Array<Int>.prefixesInt) 和encodeTransformDecode( transform(encode())()) 之间。通过使用简写并传递闭包,不需要更改encodeTransformDecode

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将 Array{Int, 1} 转换为 Array{Int, 2}

来自分类Dev

无法将std :: array转换为int?

来自分类Dev

'初始化':无法从'Array <int,3>'转换为'int'

来自分类Dev

将指针转换为Array(将int *转换为int [2])

来自分类Dev

将Array {Int64}转换为Array {Int32}时检查溢出的方法

来自分类Dev

ndarray转换为Structural_array并浮动为int

来自分类Dev

ndarray转换为Structural_array并浮动为int

来自分类Dev

无法在python DataFrame/Array中将float转换为int

来自分类Dev

如何将Array <_Element>转换为数组文字

来自分类Dev

将Array [Int]转换为Map [Int,Int]的Scala功能样式

来自分类Dev

int[][] 不能转换为 int

来自分类Dev

int 不能转换为 int []

来自分类Dev

如何将Array [org.apache.spark.sql.Row]转换为Array [Int]

来自分类Dev

Int Array []不能很好地打印。

来自分类Dev

如何将int [4]转换为std :: array <int,4>?

来自分类Dev

如何在Scala中轻松将IndexedSeq [Array [Int]]转换为Seq [Seq [Int]]?

来自分类Dev

无法将“Int”类型的值转换为预期的参数类型“[CChar]”(又名“Array<Int8>”)

来自分类Dev

Scala:从Array [Array [Int]]到Array [Int]

来自分类Dev

IndexedSeq [Int]与Array [Int]

来自分类Dev

Int不能转换为T

来自分类Dev

String 到 int Array 的转换可能吗?

来自分类Dev

'Int'不能转换为'Range <Int>'

来自分类Dev

'Int'不能转换为'Range <Int>

来自分类Dev

如何在不复制的情况下将Int32Array转换为Uint8Array

来自分类Dev

如何将具有偏移量的Uint8Array转换为Int32Array?

来自分类Dev

Node.js将缓冲区转换为Int8Array

来自分类Dev

无法将类型“ [array]”的值转换为预期参数类型“ Range <Int>”

来自分类Dev

Node.js将缓冲区转换为Int8Array

来自分类Dev

如何将Platform :: Array <uint16>转换为原始int16 *

Related 相关文章

  1. 1

    将 Array{Int, 1} 转换为 Array{Int, 2}

  2. 2

    无法将std :: array转换为int?

  3. 3

    '初始化':无法从'Array <int,3>'转换为'int'

  4. 4

    将指针转换为Array(将int *转换为int [2])

  5. 5

    将Array {Int64}转换为Array {Int32}时检查溢出的方法

  6. 6

    ndarray转换为Structural_array并浮动为int

  7. 7

    ndarray转换为Structural_array并浮动为int

  8. 8

    无法在python DataFrame/Array中将float转换为int

  9. 9

    如何将Array <_Element>转换为数组文字

  10. 10

    将Array [Int]转换为Map [Int,Int]的Scala功能样式

  11. 11

    int[][] 不能转换为 int

  12. 12

    int 不能转换为 int []

  13. 13

    如何将Array [org.apache.spark.sql.Row]转换为Array [Int]

  14. 14

    Int Array []不能很好地打印。

  15. 15

    如何将int [4]转换为std :: array <int,4>?

  16. 16

    如何在Scala中轻松将IndexedSeq [Array [Int]]转换为Seq [Seq [Int]]?

  17. 17

    无法将“Int”类型的值转换为预期的参数类型“[CChar]”(又名“Array<Int8>”)

  18. 18

    Scala:从Array [Array [Int]]到Array [Int]

  19. 19

    IndexedSeq [Int]与Array [Int]

  20. 20

    Int不能转换为T

  21. 21

    String 到 int Array 的转换可能吗?

  22. 22

    'Int'不能转换为'Range <Int>'

  23. 23

    'Int'不能转换为'Range <Int>

  24. 24

    如何在不复制的情况下将Int32Array转换为Uint8Array

  25. 25

    如何将具有偏移量的Uint8Array转换为Int32Array?

  26. 26

    Node.js将缓冲区转换为Int8Array

  27. 27

    无法将类型“ [array]”的值转换为预期参数类型“ Range <Int>”

  28. 28

    Node.js将缓冲区转换为Int8Array

  29. 29

    如何将Platform :: Array <uint16>转换为原始int16 *

热门标签

归档