这儿每天分享一个 iOS 的新知识,快来重视我吧
前言
在 Swift 中,最常用的类型包含类(Class
)、结构体(Struct
)和枚举(Enum
)。在声明类办法时,既可以用 static
又可以用 class
。在本篇文章中,咱们将深入评论 class
和 static
的差异,并经过实例代码来提醒他们的特性和运用办法。
class 和 static 在类中的运用
首要,让咱们了解一下 class
和 static
这两个要害字。
class
要害字用于界说类办法,这些办法只能由类自身调用,不能被类的实例调用。class
界说的类办法可以被子类掩盖。
而 static
要害字用于界说静态办法,同样,这些办法只能由类自身调用,不能被类的实例调用。static
界说的静态办法不能被子类掩盖。
下面,咱们经过一些代码示例来看看这两个要害字在实际运用中的差异。
classMyClass{
classfuncclassMethod(){
print("classMethodinMyClass")
}
staticfuncstaticMethod(){
print("staticMethodinMyClass")
}
}
classMySubClass:MyClass{
overrideclassfuncclassMethod(){
print("classMethodinMySubClass")
}
//这儿会报错,由于静态办法不能被掩盖
//overridestaticfuncstaticMethod(){}
}
在上面的代码中,MyClass
界说了两个办法:classMethod
和 staticMethod
。classMethod
运用 class
要害字界说,staticMethod
运用 static
要害字界说。然后,咱们创立了一个 MyClass
的子类 MySubClass
,在这个子类中,咱们企图掩盖这两个办法。
成果发现,classMethod
可以被 MySubClass
成功掩盖,而 staticMethod
无法被掩盖,由于 static
界说的办法不能被子类掩盖。
下面,咱们来看看这两个办法怎么被调用。
MyClass.classMethod()//输出"classMethodinMyClass"
MyClass.staticMethod()//输出"staticMethodinMyClass"
MySubClass.classMethod()//输出"classMethodinMySubClass"
MySubClass.staticMethod()//输出"staticMethodinMyClass"
可以看到,classMethod
和 staticMethod
都可以经过类名来调用。由于 MySubClass
掩盖了 classMethod
,所以 MySubClass.classMethod()
调用的是 MySubClass
中的 classMethod
。而 MySubClass.staticMethod()
调用的仍然是 MyClass
中的 staticMethod
,由于 staticMethod
不能被掩盖。
在结构体和枚举中的运用
在 Objective-C 中,只能为类界说类型办法。在 Swift 中,您可以为所有类、结构和枚举界说类型办法。
不同的是,在结构体(struct
)和枚举(enum
)这两种类型中,class 要害字是无法运用的,只能运用 static
要害字来界说类型办法。
当 static
要害字用于 struct
或 enum
中时,它的效果与在 class
中一样,界说的办法是属于类型自身的,可以直接经过类型名来调用,而无需创立该类型的实例。其实,struct
和 enum
本质上都是值类型,它们的办法默许便是不能被子类或者子类型掩盖的(不能承继),所以这儿 static
要害字只要一个效果,便是界说类型办法。
structMyStruct{
staticfuncstaticMethod(){
print("staticMethodinMyStruct")
}
}
enumMyEnum{
staticfuncstaticMethod(){
print("staticMethodinMyEnum")
}
}
MyStruct.staticMethod()//输出"staticMethodinMyStruct"
MyEnum.staticMethod()//输出"staticMethodinMyEnum"
在上面的代码中,咱们界说了一个结构体 MyStruct
和一个枚举 MyEnum
,并在这两个类型中都界说了一个静态办法 staticMethod
。然后,咱们可以经过类型名来调用这些静态办法。
为什么这么规划
class
和 static
在 Swift 中的规划,首要是为了供给两种不同的类办法。从规划视点来看,这两种要害字的差异首要在于它们的承继行为,即 class
界说的办法可以被子类掩盖,而 static
界说的办法不能被子类掩盖。这样的规划可以供给更大的灵活性,让开发者可以根据需要选择适宜的办法类型。
从原理和底层完成来看,class
和 static
的差异首要体现在它们的办法调用机制上。class
界说的类办法是经过动态派发的方式来调用的,也便是说,当你调用一个类办法时,Swift 会在运行时查找并调用正确的办法。而 static
界说的静态办法是经过静态派发的方式来调用的,也便是说,当你调用一个静态办法时,Swift 会在编译时就确定这个办法的调用。
这儿每天分享一个 iOS 的新知识,快来重视我吧