代码之家  ›  专栏  ›  技术社区  ›  Aggressor

Rxswift combinelatest如何使用闭包中的匿名类并处理其他参数?

  •  0
  • Aggressor  · 技术社区  · 7 年前

    据我所知,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个参数来创建的吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sven    7 年前

    这个 (arg1: $1, arg2: $0.0, arg3: $0.1, arg4: $2) 闭包内部的部分创建一个元组。元组是一组任意类型的多个值。一个元组的每个元素都可以有一个名称,但它们总是可以通过数字访问。在您的示例中,tuple有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 
    

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

    推荐文章