我可以创建迭代器来创建前缀:
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
的简写,即调用的self
Array<Equatable>
)。高温高压
要查看与生成的代码的连接,请考虑:
<value>.method(<args>)
只是一个缩写:
<type of value>.method(<value>)(<args>)
在这种情况下,这意味着:
$0.prefixesInt()
是:
Array<Int>.prefixesInt($0)()
这是你生产的,但分布在
prefixes2
(prefixes()
)和Array<Int>.prefixesInt
(encodeTransformDecode
)之间。通过使用速记和传递闭包,不需要对transform(encode())()
进行任何更改。关于swift - 'Array <Element>'不能转换为'Array <Int>',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53335355/