首页 > 解决方案 > RXSwift 如何结合最新使用,长什么样,闭包中的匿名类并处理附加参数

问题描述

据我了解,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
                 }

我遇到的问题是将 combineLatest 转换为此的块,看起来像匿名类。

当我查看 combineLatest 的签名时,它显示:

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 关闭通过@escaping (O1.E, O2.E, O3.E)

似乎正在创建一个新的匿名对象,它有 4 个参数而不是 3 个。

您能否解释一下如何创建一个看似匿名的类(我不完全理解为可能)的新可观察对象,并使用 4 个参数而不是 3 个参数创建?

标签: swiftobservablerx-swiftcombinelatest

解决方案


闭包内的(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)

要访问元组的值,请使用 a.后跟名称或索引:

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

请注意,即使元素已命名,您也可以使用索引。


推荐阅读