您的位置:首页 > 移动开发 > Swift

[swift学习之六]@autoClosure练习

2016-05-08 15:01 477 查看
<pre name="code" class="plain">/*注意点:
1,return ANeed && ACanUseSum,只有前面为true的时候才计算后面,和其他语言一样~
2,用函数的返回值作为实参的时候,肯定调用,如形式1;
3,用函数的体作为实参的时候,符合条件时调用,如形式2
4,函数闭包就是省的写oc中大扩号前面的部分了,如^BOOL()。
5,形参加入@autoclosure修饰后,都变成了{return ...}形式,即使传入的实参是一个变量。
6,@autoclosure只能修饰()->T 这样的形参。
都是个人理解啊,写错的还望指正~
*/
/*形式1,CaculateSum肯定会之行,即使前面的aneed为false*/
func CaculateSum1()->Int{
print("调用了方法:CaculateSum1")
return 20
}
func ShowResult1(ANeed:Bool,ACanUseSum: Bool) -> Bool {
return ANeed && ACanUseSum
}
if ShowResult1(true, ACanUseSum: CaculateSum1() == 20){
print("ShowResult1")
}
/*形式2,传入闭包,前面的aneed为true的时候才之行。*/
func CaculateSum2()->Int{
print("调用了方法:CaculateSum2")
return 20
}
func ShowResult2(ANeed:Bool,ACanUseSum: ()->Bool) -> Bool {
return ANeed && ACanUseSum()
}
if ShowResult2(true, ACanUseSum: {return CaculateSum2() == 20}){
print("ShowResult2")
}
/*形式3,@autoclosure作用凸显。和形式1的实参,和形式2的效果*/
func CaculateSum3()->Int{
print("调用了方法:CaculateSum3")
return 20
}
func ShowResult3(ANeed:Bool,@autoclosure ACanUseSum: ()->Bool) -> Bool {
return ANeed && ACanUseSum()
}
if ShowResult3(false, ACanUseSum: CaculateSum2() == 20){
print("ShowResult3")
}

/*苹果官方文档对autoclosure的用法*/
var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
let autofun = {customersInLine.removeAtIndex(0)}//()->string类型的闭包,没有执行。Count=5
/*直接执行,Count=4*/
autofun()
/*作为参数,Count=3*/
func RemoveObj(fun:()->String)->String{
return fun()
}
RemoveObj(autofun)
/*@autoclosure加上,作为参数,Count=2*/
func AutoRemoveObj(@autoclosure fun:()->String)->String{
return fun()
}
AutoRemoveObj(customersInLine.removeAtIndex(0))
/*@autoclosure(escaping)用法
加上(escaping)后,不但能直接调用,还可以把函数先缓存起来,以后调用。
*/
typealias AutoFunType = ()-> String
var AutoFunctions = [AutoFunType]()
func getWorld() -> String {
return "World"
}
func addAutoFun(@autoclosure(escaping) fun:AutoFunType) -> Void {
AutoFunctions.append(fun)
}
addAutoFun("Hello")
addAutoFun(getWorld())
print(AutoFunctions[0]() + AutoFunctions[1]())


Objective-C的相关练习部分

-(NSUInteger) fun1
{
NSLog(@"fun1");
return 20;
}
-(BOOL)AddFun1:(BOOL)Afirst second:(BOOL) aSecond
{
return Afirst && aSecond;
}

-(NSUInteger) fun2
{
NSLog(@"fun2");
return 20;
}
-(BOOL)AddFun2:(BOOL)Afirst second:(BOOL(^)()) aSecond
{
return Afirst && aSecond();
}

-(NSUInteger) fun3
{
NSLog(@"fun3");
return 20;
}
-(BOOL)AddFun3:(BOOL)Afirst second:(TestClosure) aSecond
{
return Afirst && aSecond();
}

- (void)viewDidLoad {
/*第一种:肯定之行fun1,不管afirst是否为yes*/
[self AddFun1:NO second:[self fun1] == 20];
/*第二种:Afirst==yes才执行fun2*/
[self AddFun2:NO second:^BOOL{
return [self fun2] == 20;
}];
/*第三种:和第二种效果一样*/
TestClosure tfun = ^BOOL(){
return [self fun3] == 20;
};
[self AddFun3:NO second:tfun];

[super viewDidLoad];
}
个人觉得@autoClosure存在的意义不是很大,多写点儿也可以接受啊。

还没有理解必须的使用场景,以后遇到再说吧~!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: