gpt4 book ai didi

swift - '数组 <元素 >' is not convertible to ' 数组 '

转载 作者:行者123 更新时间:2023-11-28 14:03:07 25 4
gpt4 key购买 nike

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

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) 将类型编码为 Ints

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> 传递的值是函数中绑定(bind)到 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 预绑定(bind)的当前值——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 进行任何更改。

关于swift - '数组 <元素 >' is not convertible to ' 数组 <Int>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53335355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com