- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是软件开发的新手,正在为 iPhone 完成我的第一个应用程序。
在学习 Swift 的过程中,我了解到我可以在类定义之外添加函数,并且可以在所有 View 中访问它。一段时间后,我发现自己制作了许多用于设置应用首选项的全局函数(注册默认值、UIAppearance 等)。
这是不好的做法吗?我能想到的唯一替代方法是创建一个自定义类来封装它们,但这样类本身就没有任何用途,我必须想办法将它传递给 View 。
最佳答案
全局函数:好(恕我直言,尽管有些人不同意)
全局状态:不好(普遍认同)
我的意思是,分解您的代码以创建许多小的实用函数,使它们通用并重新使用它们可能是一个很好的做法。只要它们是“pure functions ”
例如,假设您发现自己正在检查数组中的所有条目是否都具有某个属性。您可以在数组上编写一个 for 循环来检查它们。您甚至可以重新使用标准的 reduce
来完成它。或者您可以编写一个可重复使用的函数 all
,它采用一个闭包来检查元素,并对数组中的每个元素运行它。当您阅读 let allAboveGround = all(sprites) { $0.position.y > 0 }
而不是 for...in
循环的代码时,这很好很清楚做同样的事情。您还可以专门为您的 all
函数编写单独的单元测试,并确信它可以正常工作,而不是对包含嵌入其中的 all 版本的函数进行复杂得多的测试
以及其他业务逻辑。
将您的代码分解成更小的函数也有助于避免使用太多 var
。例如,在上面的示例中,您可能需要一个 var
来跟踪循环的结果,但是可以使用 let< 分配
。支持使用 all
函数的结果let
声明的不可变变量有助于使您的程序更易于推理和调试。
正如@drewag 在他的回答中指出的那样,您不应该做的是编写更改全局变量的函数(或访问等同于同一事物的单例)。您编写的任何全局函数都应该只对它们的输入进行操作,并且无论何时调用它们,每次都会产生完全相同的结果。改变全局状态的全局函数(即更改全局变量(或更改通过引用作为参数传递给它们的变量的值)可能会导致难以预料的调试,因为它们可能会导致意外的副作用。
编写纯全局函数有一个缺点*,那就是您最终会“污染命名空间”——也就是说,您拥有所有这些可能与程序的特定部分具有特定相关性的函数,但是无处不在。老实说,对于一个中等规模的应用程序,具有编写良好的通用函数的合理命名,这可能不是问题。如果函数纯粹用于特定结构或类,则可以将其设为静态方法。如果你的项目真的变得太大了,你也许可以将最通用的功能分解到一个单独的框架中,尽管这是一个相当大的开销/学习练习(而且 Swift 框架还没有完全成熟),所以如果你才刚刚开始,所以我建议您暂时离开这个,直到您变得更加自信为止。
* 编辑:好吧,有两个缺点——成员函数更容易被发现(当你点击 . 时通过自动完成)
关于xcode - 有很多全局函数不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27583844/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!