在Swift类中的静态与类的函数/variables?
下面的代码在Swift 1.2中编译:
class myClass { static func myMethod1() { } class func myMethod2() { } static var myVar1 = "" } func doSomething() { myClass.myMethod1() myClass.myMethod2() myClass.myVar1 = "abc" }
静态函数和类函数有什么区别? 我应该使用哪一个,什么时候?
如果我尝试定义另一个variablesclass var myVar2 = ""
,它说:
类中尚未支持的类存储属性; 你的意思是“静态”?
当这个特性被支持的时候, 静态variables和类variables之间有什么区别? 我应该使用哪一个,什么时候?
(Xcode 6.3)
static
和class
都将方法与class
相关联,而不是类的实例。 不同之处在于子类可以覆盖class
方法; 他们不能覆盖static
方法。
class
属性在理论上将以相同的方式运行(子类可以覆盖它们),但是它们在Swift中是不可能的。
我尝试了mipadi在操场上的回答和评论。 并想到分享它。 干得好。 我认为mipadi的答案应该被接受。
class A{ class func classFunction(){ } static func staticFunction(){ } class func classFunctionToBeMakeFinalInImmediateSubclass(){ } } class B: A { override class func classFunction(){ } //Compile Error. Class method overrides a 'final' class method override static func staticFunction(){ } //Lets avoid the function called 'classFunctionToBeMakeFinalInImmediateSubclass' being overriden by subclasses /* First way of doing it override static func classFunctionToBeMakeFinalInImmediateSubclass(){ } */ // Second way of doing the same override final class func classFunctionToBeMakeFinalInImmediateSubclass(){ } //To use static or final class is choice of style. //As mipadi suggests I would use. static at super class. and final class to cut off further overrides by a subclass } class C: B{ //Compile Error. Class method overrides a 'final' class method override static func classFunctionToBeMakeFinalInImmediateSubclass(){ } }
对于面向对象 ,答案太简单了:
子类可以覆盖类方法,但不能覆盖静态方法。
除了你的post之外,如果你想声明一个类variables(就像你做了class var myVar2 = ""
),你应该这样做:
class var myVar2:String { return "whatever you want" }
我在我的一个项目中也遇到了这个困惑,发现这个post非常有帮助。 在我的操场上也一样,这里是总结。 希望这可以帮助有存储属性和types的static
, final
, class
,覆盖类variables等function的人。
class Simple { init() {print("init method called in base")} class func one() {print("class - one()")} class func two() {print("class - two()")} static func staticOne() {print("staticOne()")} static func staticTwo() {print("staticTwo()")} final func yesFinal() {print("yesFinal()")} static var myStaticVar = "static var in base" //Class stored properties not yet supported in classes; did you mean 'static'? class var myClassVar1 = "class var1" //This works fine class var myClassVar: String { return "class var in base" } } class SubSimple: Simple { //Successful override override class func one() { print("subClass - one()") } //Successful override override class func two () { print("subClass - two()") } //Error: Class method overrides a 'final' class method override static func staticOne() { } //error: Instance method overrides a 'final' instance method override final func yesFinal() { } //Works fine override class var myClassVar: String { return "class var in subclass" } }
这里是testing样本:
print(Simple.one()) print(Simple.two()) print(Simple.staticOne()) print(Simple.staticTwo()) print(Simple.yesFinal(Simple())) print(SubSimple.one()) print(Simple.myStaticVar) print(Simple.myClassVar) print(SubSimple.myClassVar) //Output class - one() class - two() staticOne() staticTwo() init method called in base (Function) subClass - one() static var in base class var in base class var in subclass
Swift 4中的testing显示了模拟器的性能差异。 我用“class func”做了一个类,并且用“static func”构造了一个类,然后在testing中运行它们。
静态function是:
- 编译器优化速度提高20%
- 优化时,速度提高38% – 启用全部模块优化。
但是,在iOS 10.3下运行相同的代码显示了完全相同的性能。
这里是示例项目在Swift 4 Xcode 9,如果你想自己testinghttps://github.com/protyagov/StructVsClassPerformance
还有一个区别 class
只能用于定义计算types的types属性。 如果你需要一个存储的types属性,请使用static
。
“你可以用static关键字来定义types属性,对于classtypes的计算types属性,你可以使用class关键字来允许子类重载超类的实现。