在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)

staticclass都将方法与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的staticfinalclass ,覆盖类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关键字来允许子类重载超类的实现。