使用类func vs func vs no class声明的好处

Boi*_*oid 11 swift

好的,我的项目中有一堆辅助函数,我最初在一个名为Animate的类中.我很想知道声明func vc类func有什么好处.

让我们使用它作为示例类:

class Animate{
    func moveView(...){
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我相信如果我有一个类func,我就不必实例化这个类了.

Animate.moveView(...)

如果我只用func声明函数,它将是:

Animate().moveView(...)

但是,如果我不将该文件声明为类,则:

func moveView(...){
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我调用该函数时,它只是:

moveView(...)
Run Code Online (Sandbox Code Playgroud)

没有指示代码来自哪里,它可以在项目的任何地方使用.

这三种方式的优点和缺点是什么?是不是宣布一个不好的做法?或者,是否有一些边缘情况,这是非常有用的?例如,在我的情况下,我不需要一个类,因为我只是创建辅助函数而不是对象.

提前感谢您对此有任何见解!

Dun*_*n C 16

好.实例方法与类方法与全局方法.

(术语方法和函数是可互换的.方法意味着由对象实现的函数,所以我更倾向于将术语方法更改为术语函数.)

实例方法是由类的实例执行的方法.您必须具有要与之对话的类的实例才能调用实例方法.

实例方法可以访问它们所属对象的实例变量,因此该对象可以在调用之间保存状态信息.(在网络类中,您可以创建多个下载对象,每个下载对象管理来自不同URL的不同文件的单个文件下载,并且每个下载对象可能具有在下载完成时通知的不同委托)

类方法由类本身调用,而不是由实例调用.这可以使调用辅助函数变得简单,而无需管理对象来为您完成这项工作.由于类方法不与类的实例通信,因此它们无法为每个对象保留不同的状态信息.例如,您可能有一个在字符串上执行本地化函数的实用程序类.本地化过程是独立的.你调用一个类函数并传入一个字符串和你希望它本地化的语言,它会把你的结果交给你.无需在呼叫之间保持状态.这样的电话可能看起来像

let frenchString = 
  LocalizationUtils.localizeString("English String", 
    toLanguage: "French")
Run Code Online (Sandbox Code Playgroud)

全局函数不属于任何特定类.它们是定义它们的整个模块的全局模块.它们与类函数类似,只是它们不是特定于特定类的.


Aar*_*sen 5

我同意(并赞成)@Duncan C 的回答,但只是想我会提出其他一些优点/缺点。

我倾向于喜欢全局函数而不是类方法,因为全局函数不会使我的类变得混乱。我喜欢让我的班级保持精简。全局函数可以保存在一个单独的文件中,我可以根据需要将其复制和粘贴或导入到给定的项目中。所以我的项目中可能有一个文件AnimateHelperFunctions,它只是与该类相关的全局函数。一个给定的项目可能只需要其中的几个,或者大部分,或者那些加上我发现我需要的更多。我可以从文件中删除我在给定项目中不使用的那些,以保持该文件的整洁和修剪。

我只是认为全局函数更加模块化,并鼓励我为单个函数分解单个任务 - 一个很好的全局辅助函数,它只做一件事并且做得很完美,有时也可以被抽象或通用,并在其他上下文中使用好。某个时候您可能有一个项目,您意识到您不需要该类 - 您只需要它的辅助函数,它就在那里。

我更喜欢一百个简单的全局函数,我可以从一个巨大的臃肿类中挑选。

当然,您可以使用扩展来完成相同的事情,并且在某种程度上这是一个品味问题,因为类方法和全局函数之间几乎没有区别(有什么?),除了使用类方法您必须拖着整个班级。

与全局状态不同,全局函数没有任何危险。当然,任何人都可以调用它,但类方法也是如此,全局函数只能对传递给它的参数进行操作。