Как RXSwift сочетает в себе последнее использование, как выглядит анонимный класс в замыкании и обрабатывает дополнительные параметры - PullRequest
0 голосов
/ 21 ноября 2018

Насколько я понимаю, Swift не поддерживает анонимные классы.

Я работаю с базой кода RXSwift, и есть блок кода, который я не могу полностью понять, что происходит.

Вот блок:

    sections = Observable.combineLatest(observable1,
                                        observable2,
                                        observable3)
                                        {
                                            (arg1: $1,
                                            arg2: $0.0,
                                            arg3: $0.1,
                                            arg4: $2)
                                        }
                .map { arg1, arg2, arg3, arg4 -> [Section] in
                    // Do Stuff
                 }

У меня проблема с блоком, в котором он преобразует комбинатПоследний в этот, похоже, анонимный класс.

Когда я смотрю на подписьдля combLatest показывает:

public static func combineLatest<O1, O2, O3>(_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> Self.E) -> RxSwift.Observable<Self.E> where O1 : ObservableType, O2 : ObservableType, O3 : ObservableType

Итак, когда я читаю, закрытие @escaping принимает 3 аргумента через @escaping (O1.E, O2.E, O3.E)

Похоже, создается новый анонимный объект,и один с 4 аргументами вместо 3.

Не могли бы вы объяснить, как создается новая наблюдаемая часть, казалось бы, анонимного класса (который я не совсем понимаю как возможный), и создается с помощью 4аргументы вместо 3?

1 Ответ

0 голосов
/ 21 ноября 2018

Часть (arg1: $1, arg2: $0.0, arg3: $0.1, arg4: $2) внутри замыкания создает кортеж.Кортеж - это группа из нескольких значений любого типа.Каждый элемент кортежа может иметь имя, но к ним всегда можно получить доступ по номеру.В вашем примере кортеж имеет 4 элемента с именами arg1, arg2, arg3 и arg4.Элементы кортежа могут иметь любой тип.

Синтаксис для создания кортежей представляет собой список значений, разделенных запятыми, с необязательными именами в скобках:

 let a = (1, "hello", true)
 let b = (first: 1, second: "hello", true)

Для доступа к значениямкортеж вы используете ., за которым следует имя или индекс:

 print(a.0, a.1, a.2)
 print(b.first, b.second, b.2)
 let x = b.0 

Обратите внимание, что вы также можете использовать индекс, даже если элемент назван.

...