Ответ 1
Здесь компилятор Swift не может вывести тип driveArg1
и driveArg2
из-за отсутствия контекста. При использовании inline внутри вызова drive()
у компилятора есть больше подсказок относительно того, какой тип каждого параметра может быть, и мы не нуждаемся в компиляции для этих типов.
Учитывая это, попробуйте добавить аннотацию типа для этих двух переменных.
Во-первых, мы обновим сигнатуру rx_itemsWithCellIdentifier
с быстрым 2.2 в виду, удалив запутанный синтаксис currying, а также добавим общие аннотации
public func rx_itemsWithCellIdentifier
<S: SequenceType, Cell: UITableViewCell, O : ObservableType where O.E == S>
(cellIdentifier: String, cellType: Cell.Type = Cell.self)
-> (source: O)
-> (configureCell: (Int, S.Generator.Element, Cell) -> Void)
-> Disposable
Тип driveArg2
Это аргумент, который мы передаем в curriedArgument
of drive()
, и будет аргументом, который мы перейдем к rx_itemsWithCellIdentifier
после применения (source: O)
. Таким образом, он должен соответствовать (Int, S.Generator.Element, Cell) -> Void
Есть два неизвестных в определении этого типа, S.Generator.Element
и Cell
. Они носят общий характер, поэтому нам нужно выяснить, что они собой представляют.
-
Cell
легко, это тип ячейки, которую мы хотим настроить, здесьWikipediaSearchCell
. -
S.Generator.Element
немного сложнее, но мы можем легко понять это. ИзO.E == S
получаем, что тип последовательности - это тип, который мы находим между угловой скобкой нашего исходного элемента. В нашем случае источник (temp1
) имеет типObservable<[SearchResultViewModel]>
. Таким образом, типS
равен[SearchResultViewModel]
, поэтомуS.Generator.Element
будетSearchResultViewModel
Хорошо, теперь мы имеем подпись driverArg2
:
(Int, SearchResultViewModel, WikipediaSearchCell) -> Void
Чтобы упростить то, что будет дальше, определим для него typealias
typealias CellConfigurator = (Int, SearchResultViewModel, WikipediaSearchCell) -> Void
Теперь мы можем определить driveArg2
let driveArg2: CellConfigurator = { (_, viewModel: SearchResultViewModel, cell: WikipediaSearchCell) in
cell.viewModel = viewModel
}
Тип driveArg1
Теперь, когда driveArg2
не работает, выясняется, что тип driveArg1
становится проще. Это просто возвращаемый тип rx_itemsWithCellIdentifier
с заменой общей части
typealias DriveArg2Type = (source: Observable<[SearchResultViewModel]>) -> (CellConfiguration) -> Disposable
drive
подпись
При всем этом расширении сигнатура типа для drive
, надеюсь, имеет больше смысла:
drive(Self -> R1 -> R2, curriedArgument: R1) -> R2
// where
Self = Observable<[SearchResultViewModel]>
R1 = CellConfigurator
R2 = Disposable