Swift类中的静态vs类函数/变量?

时间:2015-04-14 20:17:26

标签: function class swift variables static

以下代码在Swift 1.2中编译:

class myClass {
    static func myMethod1() {
    }
    class func myMethod2() {
    }
    static var myVar1 = ""
}

func doSomething() {
    myClass.myMethod1()
    myClass.myMethod2()
    myClass.myVar1 = "abc"
}

静态功能和功能有什么区别?我应该使用哪一个?何时使用?

如果我尝试定义另一个变量class var myVar2 = "",它会说:

  

类中尚不支持的类存储属性;你是说'静态'?

当支持此功能时,静态变量和变量之间的区别是什么(即两者都是在类中定义的)?我应该使用哪一个?何时使用?

(Xcode 6.3)

9 个答案:

答案 0 :(得分:615)

staticclass都将方法与类相关联,而不是类的实例。不同之处在于子类可以覆盖class方法;他们无法覆盖static方法。

class属性理论上将以相同的方式运行(子类可以覆盖它们),但它们在Swift中是不可能的。

答案 1 :(得分:62)

我尝试了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(){

    }
}

答案 2 :(得分:21)

关于 OOP ,答案太简单了:

子类可以覆盖 class 方法,但不能覆盖 static 方法。

除了你的帖子,如果你想申报一个变量(就像你class var myVar2 = ""那样),你应该按照以下步骤进行:

class var myVar2: String {
    return "whatever you want"
}

答案 3 :(得分:21)

我在我的一个项目中也遇到了这个困惑,发现这篇文章非常有帮助。在我的操场上尝试过同样的事情,这是摘要。希望这可以帮助那些具有staticfinalclass类型的存储属性和函数,覆盖类变量等的人。

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"
    }
}

以下是测试样本:

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

答案 4 :(得分:18)

Swift 4中的测试显示了模拟器中的性能差异。我用" class func"做了一堂课。和#34;静态函数"并在测试中运行它们。

static func是:

  • 20%更快,无需编译器优化
  • 启用优化-whole-module-optimization时,
  • 38%更快。

但是,在iOS 10.3下在iPhone 7上运行相同的代码会显示完全相同的性能。

如果您想测试自己,可以使用Swift 4中的Xcode 9示例项目 https://github.com/protyagov/StructVsClassPerformance

答案 5 :(得分:6)

答案 6 :(得分:3)

添加到上述答案中的静态方法是静态调度,这意味着编译器知道在运行时将执行哪种方法,因为静态方法不能被覆盖,而类方法可以是动态调度,因为子类可以覆盖这些方法。

答案 7 :(得分:0)

还有另外一个区别。类只能用于定义计算类型的类型属性。如果需要存储的类型属性,请使用static。

类别:-参考类型

struct:-值类型

答案 8 :(得分:0)

staticclass final

  • class property and method 可以被子类覆盖
  • static property and method 不能被子类更改

一个:

Global function是在类范围之外定义的函数