Swift3:泛型扩展中的类型推断
Swift3: type inference inside generic extension
我需要做这样的事情:
extension Array {
func flat() -> Element { return self.flatMap { [=10=] } }
}
但是类型推断有问题:
'flatMap' produces '[SegmentOfResult.Iterator.Element]', not the
expected contextual result type 'Element'
编辑: 用法示例:
[[1,2],[3,4,5],[6]].flat()
应该产生 [1,2,3,4,5,6]
与以下内容相同:
[[1,2],[3,4,5],[6]].flatMap { [=12=] }
如果你看一下 flatMap(_:)
签名,
extension Sequence {
// ...
public func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]
// ...
}
您会看到它 return 是一个 [SegmentOfResult.Iterator.Element]
,其中 SegmentOfResult
是从您传递给它的函数中 return 得到的类型。这不一定与 Element
相同类型(因为您的扩展是针对 all 数组),这就是您的代码无法编译的原因。
为了使用元素为序列的数组,您需要限制扩展,以便 Element : Sequence
.
此外,由于您传递给 flatMap(_:)
的函数是恒等变换(它只是 return 作为输入接收的元素),您需要更改 return 键入 [Element.Iterator.Element]
(内部元素的数组)。
extension Array where Element : Sequence {
func flat() -> [Element.Iterator.Element] {
return self.flatMap { [=11=] }
}
}
尽管如此,我看不出为什么这不应该是 Sequence
:
的扩展
// An extension for a sequence of sequences
extension Sequence where Iterator.Element : Sequence {
// returns an array of the inner element type (an array of the element of the element)
func flat() -> [Iterator.Element.Iterator.Element] {
return self.flatMap { [=12=] }
}
}
(但是,我一开始并不认为有必要为此创建扩展 - array.flatMap{[=21=]}
并不冗长!)
我需要做这样的事情:
extension Array {
func flat() -> Element { return self.flatMap { [=10=] } }
}
但是类型推断有问题:
'flatMap' produces '[SegmentOfResult.Iterator.Element]', not the expected contextual result type 'Element'
编辑: 用法示例:
[[1,2],[3,4,5],[6]].flat()
应该产生 [1,2,3,4,5,6]
与以下内容相同:
[[1,2],[3,4,5],[6]].flatMap { [=12=] }
如果你看一下 flatMap(_:)
签名,
extension Sequence {
// ...
public func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]
// ...
}
您会看到它 return 是一个 [SegmentOfResult.Iterator.Element]
,其中 SegmentOfResult
是从您传递给它的函数中 return 得到的类型。这不一定与 Element
相同类型(因为您的扩展是针对 all 数组),这就是您的代码无法编译的原因。
为了使用元素为序列的数组,您需要限制扩展,以便 Element : Sequence
.
此外,由于您传递给 flatMap(_:)
的函数是恒等变换(它只是 return 作为输入接收的元素),您需要更改 return 键入 [Element.Iterator.Element]
(内部元素的数组)。
extension Array where Element : Sequence {
func flat() -> [Element.Iterator.Element] {
return self.flatMap { [=11=] }
}
}
尽管如此,我看不出为什么这不应该是 Sequence
:
// An extension for a sequence of sequences
extension Sequence where Iterator.Element : Sequence {
// returns an array of the inner element type (an array of the element of the element)
func flat() -> [Iterator.Element.Iterator.Element] {
return self.flatMap { [=12=] }
}
}
(但是,我一开始并不认为有必要为此创建扩展 - array.flatMap{[=21=]}
并不冗长!)