Если вы посмотрите на flatMap(_:)
подписи,
extension Sequence {
// ...
public func flatMap<SegmentOfResult : Sequence>(_ transform: (Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element]
// ...
}
вы увидите, что она возвращает [SegmentOfResult.Iterator.Element]
, где SegmentOfResult
- это тип, возвращаемый функцией, которую вы передаете. Это не обязательно тот же тип, что и Element
(в качестве расширения для все массивов), поэтому ваш код не удается скомпилировать.
Для того, чтобы работать с массивами, где элементы являются последовательностями, вы хотите ограничить расширение, чтобы Element : Sequence
.
Кроме того, поскольку функция, которую вы передаете в flatMap(_:)
, является преобразованием идентичности (она просто возвращает элемент, который он получает как вход), вы хотите изменить тип возврата на [Element.Iterator.Element]
(массив внутреннего элемента) ,
extension Array where Element : Sequence {
func flat() -> [Element.Iterator.Element] {
return self.flatMap { $0 }
}
}
Хотя, как говорится, я не вижу причин, почему это не должно быть продолжением 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 { $0 }
}
}
(Тем не менее, я не вижу необходимости, чтобы создать расширение для это в первую очередь - array.flatMap{$0}
не совсем длинный!)
Какова цель этой функции? Каким должен быть результат '[1, 2, 3] .flat()'? –
@MartinR исправлено. – marek094