class函数在Swift中的重要性是什么?

What is the importance of class function in Swift?

考虑下面的 class:

class Downloader {

    class func downloadImageWithURL(url:String) -> UIImage! {
        let data = NSData(contentsOfURL: NSURL(string: url)!)
        return UIImage(data: data!)
    }

}

downloadImageWithURL 声明为 class 方法而不是实例方法有什么好处?

如果你想调用这个类型方法,你写

Downloader.downloadImageWithURL(...)

如果是Instance Method,需要先创建一个对象:

let downloader: Downloader = Downloader()
downloader.downloadImageWithURL(...)

在其他语言中(例如 C++,Java),您会谈论 static vs. non-static functions

本身没有优缺点之分,这是一个设计决定,非常重要!我现在想到的一条经验法则:如果不需要维护状态信息,请使用类型方法,否则使用实例方法。¹

Swift Langauge Reference 中阅读有关这些方法的更多信息。


¹ 在写这个经验法则的同时,我的脑海中浮现出一些反例。所以请将此视为一个非常粗略的经验法则,并阅读一些关于面向对象设计的更好的介绍。

实例方法适用于给定 class 的具体实例,类型方法则不然。

显然,您不能在没有实例的情况下调用实例方法。但这不仅仅是一个性能决定,更多的是关于传达方法是什么或做什么。

一个好的经验法则是:如果您不访问 class 的任何(实例)属性,它可能应该是一个类型方法。工厂方法是类型方法的一个很好的例子,但也是与 class 密切相关但不依赖于实例的任何东西。