Swift中的Static func和Class func有什么区别
你将在本文中了解到静态函数和类函数的区别。
很多时候,你可能认为它们是同一件事,但事实并非如此。让我们来了解它们之间的区别。
什么是静态函数?
在Swift中,静态函数是一种与类型而不是与实例相关的函数类型。这意味着实例不需要调用静态函数,因为它可以从类型本身调用。
示例
下面是一个如何在Swift中定义静态函数的例子 –
struct ViewPoint {
static func defaultOrigin() -> ViewPoint {
return ViewPoint(x: 0, y: 0)
}
var x: Int
var y: Int
}
let origin = ViewPoint.defaultOrigin()
print(origin)
输出
ViewPoint(x: 0, y: 0)
解释
在上面的例子中,我们创建了一个名为ViewPoint的结构,其中有一些属性,如x和y。在ViewPoint结构中,我们定义了一个名为defaultOrigin()的静态函数来获取默认的原点值。
你可以看到,我们用类型本身调用了defaultOrigin()函数,而没有创建该类型的实例。
什么是类功能?
在Swift中,类函数是一种与类而不是与实例相关的函数。这意味着你可以在类本身上调用类函数,而不是在类的一个实例上。
示例
下面是一个如何在Swift中定义一个类函数的例子–
class ViewPoint {
class func defaultOrigin() -> ViewPoint {
return ViewPoint(x: 0, y: 0)
}
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
let origin = ViewPoint.defaultOrigin()
print("x: \(origin.x), y: \(origin.y)")
输出
x: 0, y: 0
解释
在上面的例子中,我们创建了一个叫做ViewPoint的类,有一些属性,比如x和y。在ViewPoint类中,我们定义了一个叫做defaultOrigin()的类函数来获取默认原点值。
你可以看到,我们用类型本身调用了defaultOrigin()函数,而没有创建该类型的实例。
为什么我们需要静态或类函数?
每当我们在一个应用程序中编写代码时,我们可能需要包括一些执行实用任务的实用函数。你可以将这些方法定义为静态或类函数,以调用它们而不创建该类型的实例。
它们之间的区别是什么?
- 静态函数可以与结构体、类或枚举等类型相关联,而类函数只与类类型相关联。
-
静态函数是用static关键字定义的,而类函数是用class关键字定义的。
-
类函数可以被子类重写,而静态函数不能被重写。
-
类函数可以访问类的自我属性,这对于静态函数是不可能的。
示例
下面是一个如何在Swift中覆盖一个类函数的例子–
class ViewPoint {
class func defaultOrigin() -> ViewPoint {
return ViewPoint(x: 0, y: 0)
}
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
class RectangleView: ViewPoint {
override class func defaultOrigin() -> ViewPoint {
return ViewPoint(x: 1, y: 1)
}
}
let originView = ViewPoint.defaultOrigin()
print("View Origin -> x: \(originView.x), y: \(originView.y)")
let originRectangle = RectangleView.defaultOrigin()
print("Rectangle Origin -> x: \(originRectangle.x), y: \(originRectangle.y)")
输出
View Origin -> x: 0, y: 0
Rectangle Origin -> x: 1, y: 1
解释
在这个例子中。
第1步 – ViewPoint类有一个叫defaultOrigin()的类函数和一个叫staticOrigin()的静态函数,它返回一个X和Y值为0的ViewPoint实例。
第2步 – RectangleView类是ViewPoint的一个子类,它重写了defaultOrigin()类函数,以返回一个x和y值为1的ViewPoint实例。
你可以看到子类RectangleView中被重载的函数staticOrigin()被注释禁用。你可以删除注释并运行这段代码,你会看到一个类似 “error: cannot override static method “的错误。
静态函数和类函数的区别
静态功能 | 类函数 |
---|---|
可以与一个类、结构或枚举相关联。 | 可以只与类相关联。 |
由静态关键字定义。 | 由类关键词定义。 |
在子类中不能被重载。 | 可以在子类中被重写。 |
不能访问自己的属性 | 可以访问自己的财产 |
结论
我们可以使用静态或类函数来定义你应用程序中的实用任务。因为它们不依赖于实例,所以可以直接从类型本身调用。