5.4 将闭包作为参数传递时的写法优化

通过前面章节的学习,读者应该可以感受到Swift语言在设计上追求简洁与高效,开发者在将闭包作为参数传递进函数时,也可以在标准形式上做许多优化。我们依然以学生数组排序的代码为例,省略闭包返回值类型的写法如下:

        //省略返回值
        mySort(array: &stuArr, sortClosure: { (index, nextIndex) in
            return (stuArr[index] as! Student).achievement > (stuArr[nextIndex] as!
    Student).achievement
        })

闭包作为函数参数时的参数类型可以省略,是因为在函数声明时,闭包参数中已经制定了参数的类型,编译器可以进行自动推断。

如果闭包只有一行代码组成,return关键字也可以进行省略,默认会将此行代码的执行结果返回。需要注意,只有将闭包作为函数的参数才可以如此简化,示例如下:

        //省略return
        mySort(array:&stuArr, sortClosure: { (index, nextIndex) in
            (stuArr[index] as! Student).achievement > (stuArr[nextIndex] as!
    Student).achievement
        })

经过简化后的闭包结构已经简洁了很多,其实还可以继续简化。如上代码中,开发者使用index和nextIndex来标识闭包中的参数,实际上编译器会根据此闭包在作为函数参数声明时,闭包的参数列表会自动创建一组参数,参数名会以$0、$1这样的结构依次类推。因此,开发者也可以使用编译器默认生成的参数名而不必指定参数名。表现在代码写法上,开发者也可以将参数列表和闭包关键字in省略,优化后的代码如下所示:

        mySort(array: &stuArr, sortClosure: {
            (stuArr[$0] as! Student).achievement > (stuArr[$1] as!
    Student).achievement
        })

通过一步步简化后的代码与最开始的代码已有很大的不同,Swift语言在这些细节上的处理使开发者可以十分灵活地编写代码。然而这些代码的简化操作对于初学者来说可能会难于理解,读者务必要将本节的简化过程熟练应用,在开发中需要使用各种各样的闭包时,才能游刃有余。