使用@autoclosure提高Swift代码质量

在Swift中方法终于成为了“一等公民”,可以作为参数被方法利用,在接触今天的内容之前,你必须了解Swift中方法和闭包的概念。Swift支持方法嵌套,Swift中的方法和闭包在类型上是有区别的。也就是说传入方法类型的参数也可以接收闭包,可是方法只能传入匹配方法返回值类型的参数,也就是说在运行方法前需要先执行参数中的方法算出返回值在传入参数运行调用该参数的方法,如果在一个方法中使用了多个判断语句可以提前中断,那么很多时候不需要知道后面的参数的具体值,比如下面的例子

 func expensiveMethod() -> Bool{
    NSThread.sleepForTimeInterval(10.0)
    println("执行了很久")
    return true
    }

另外一个方法and需要传入两个Bool类型的参数:

 func and(first:Bool,second:Bool)->Bool{
    println("执行and方法")
    return first&&second
    }

现在调用试试:

let result = and(false, second: expensiveMethod())

你会发现速度非常的慢,这是因为先运行expensiveMethod方法算出了返回值再去执行and方法的方法体。中控台打印:

执行了很久

执行and方法

而可能and方法的结果只通过第一个参数就可以执行了,这时候更好的办法是把第二个参数改为返回Bool类型的方法,然后传入一个闭包:

    func and(first:Bool,getSecond:()->Bool)->Bool{
        if !first{
        return false
        }else{
        return getSecond()
        }
    }

调用的方法也要修改:

let result = and(false, getSecond: { return self.expensiveMethod()})

这样的修改运行速度变快了,但是程序员使用这个API的时候需要写完整的闭包结构,比较麻烦,这个时候@autoclosure就派上用场了。使用这个修饰符可以使API调用时输入返回值即可:

 func and(first:Bool,@autoclosure getSecond:()->Bool)->Bool{
        if !first{
        return false
        }else{
        return getSecond()
        }
    }

这样在调用时就可以简化输入了:

let result = and(false, getSecond: expensiveMethod())

要注意的是@autoclosure只能用在()->T这样无参数的闭包中

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 14:22:08

使用@autoclosure提高Swift代码质量的相关文章

提高php代码质量 36计

1.不要使用相对路径 常常会看到: ? 1 require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. 因此会检查过多路径. 如果该脚本被另一目录的脚本包含, 它的基本目录变成了另一脚本所在的目录. 另一问题, 当定时任务运行该脚本, 它的上级目录可能就不是工作目录了. 因此最佳选择是使用绝对路径: ? 1 2 3 4 define('ROOT' , '/var/www/project/'); re

如何提高C#代码质量

本文将<Effective C# Second Edition>一书中适用于 Unity 游戏引擎里使用 C# 的经验之谈进行了提炼,总结成为21条(一开始总结的是22条,后来发现第22条也是.NET的特性,Unity版本的mono并没有实现,所以严格意义上来说是21条)准则,供各位快速地掌握这本书的知识梗概,在 Unity 中写出更高质量的 C# 代码. <Effective C# Second Edition>一书原本有50条原则,但这50条原则是针对C#语言本身以及.NET来

如何提高团队代码质量——代码审查的实践

为什么需要代码审查 最近看了一些文章,发现敏捷开发的一些理念越来越多的团队在实践,也觉得敏捷不再像最早提出的时候那么虚,有很多体现这个理念的工具涌现.其中,"如何提高代码质量"的讨论一直很多,敏捷开发中也有好多种提案,最广为人知.但也最不靠谱的应该就是结对编程了,只要没被敏捷洗脑的人都清楚知道这个基本没有实际可操作性,然而这个做法体现的观点是多个人互相监督可以把事情做的更好,这反而是完全没有问题的.所以还有一种方式就是代码审查了,把两人同时写代码改成在不同的时间上一个人写.另外一个人看

提高PHP代码质量的36个技巧

 1.不要使用相对路径 常常会看到: 1 require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. 因此会检查过多路径. 如果该脚本被另一目录的脚本包含, 它的基本目录变成了另一脚本所在的目录. 另一问题, 当定时任务运行该脚本, 它的上级目录可能就不是工作目录了. 因此最佳选择是使用绝对路径: 1 2 3 define('ROOT' , '/var/www/project/'); requi

提高 PHP 代码质量的 36 种方法

1.不要使用相对路径 常常会看到: 1 require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. 因此会检查过多路径. 如果该脚本被另一目录的脚本包含, 它的基本目录变成了另一脚本所在的目录. 另一问题, 当定时任务运行该脚本, 它的上级目录可能就不是工作目录了. 因此最佳选择是使用绝对路径: 1 2 3 4 define('ROOT' , '/var/www/project/'); requir

如何提高JavaScript代码质量

如何编写可维护的JavaScript代码 代码风格及规范 构建检查工具 jshint配置 http://jshint.com/docs/options/ http://www.cnblogs.com/code/articles/4103070.html http://www.iteye.com/news/28028-JavaScript-code-style-guide https://github.com/fouber/fis-lint-jshint https://github.com/al

很让人受教的提高php代码质量的方法

1.不要使用相对路径 常常会看到: require_once('../../lib/some_class.php'); 该方法有很多缺点: 它首先查找指定的php包含路径, 然后查找当前目录. 因此会检查过多路径. 如果该脚本被另一目录的脚本包含, 它的基本目录变成了另一脚本所在的目录. 另一问题, 当定时任务运行该脚本, 它的上级目录可能就不是工作目录了. 因此最佳选择是使用绝对路径: define('ROOT' , '/var/www/project/'); require_once(ROO

【★★★★★】提高PHP代码质量的36个技巧

http://www.cnblogs.com/52php/p/5658031.html 不要直接使用 $_SESSION 变量 某些简单例子: $_SESSION['username'] = $username; $username = $_SESSION['username']; 这会导致某些问题. 如果在同个域名中运行了多个应用, session 变量可能会冲突. 两个不同的应用可能使用同一个session key. 例如, 一个前端门户, 和一个后台管理系统使用同一域名. 从现在开始, 使

提高代码质量:如何编写函数

阅读目录 命名 函数参数 编写函数体 总结 函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的.写好一个函数是提高程序代码质量最关键的一步.本文就函数的编写,从函数命名,代码分布,技巧等方面入手,谈谈如何写好一个可读性高.易维护,易测试的函数. 回到顶部 命名 首先从命名说起,命名是提高可读性的第一步.如何为变量和函数命名一直是开发者心中的痛点之一,对于母语非英语的我们来说,更是难上加难.下面我来说说如何为函数命名的一些想法和感受: 采用统一的命名规则 在谈及如何为函数取一