一个函数A的参数是返回值为Optional
类型的函数,如果你传入了一个返回值不是Optional
的函数,那么函数A会自动将传入函数的返回值转换为Optional
类型,来看代码示例:
func B()->Int { return 1; }
func A(fun: ()->Int?) { println(fun()); }
A(B);
|
更棒的是你还可以使用经过转换后的函数,比如:
func A(fun: ()->Int?)->()->Int? { return fun; }
var i = 0 let j = { ++i } j() j() let h = A(j) h() h() j()
|
这种特性只能作用于函数的返回值,如果是下面这种情况,就不好使了:
func B(i: Int)->Int { return i; } func A(fun: (Int?)->Int?) { println(fun(1)); }
A(B);
|
这是因为函数B希望它的参数永远不能为nil,当接收到值为nil的参数后它就不知道该怎么办了。但如果函数B的参数为Optional
类型,而函数A希望传入的函数参数为非Optional
呢?我们来看看:
func B(i: Int?)->Int { return i ?? 0 } func A(fun: (Int?)->Int?) { println(fun(1)); }
A(B);
|
上面的特新其实可以理解为,编译器使用了一个闭包,调用了你传入的函数并进行了封包操作:
func B()->Int { return 1; } func A(fun: ()->Int?) { println(fun()); } A( { Optional(B()) } );
|
这是Swift很有意思也很有用的一个特性。