首页 文章

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

提问于
浏览
349

以下代码在Swift 1.2中编译:

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

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

static 函数和 class 函数有什么区别?我应该使用哪一个,何时使用?

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

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

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

(Xcode 6.3)

7 回答

  • 19

    添加到上面的答案静态方法是静态分派意味着编译器知道哪个方法将在运行时执行,因为静态方法不能被覆盖,而类方法可以是动态分派,因为子类可以覆盖它们 .

  • 4

    还有一个区别 . class 可用于定义 computed type only 的类型属性 . 如果你需要 stored type property 而是使用 static .

    "You define type properties with the static keyword. For computed type properties for class types, you can use the class keyword instead to allow subclasses to override the superclass’s implementation."

  • 54

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

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

  • 14

    关于 OOP ,答案太简单了:

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

    除了你的帖子,如果你想声明一个 class 变量(就像你做了 class var myVar2 = "" ),你应该这样做:

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

    我在我的一个项目中也遇到了这个困惑,发现这篇文章非常有帮助 . 在我的操场上尝试过同样的事情,这是摘要 . 希望这可以帮助那些存储属性和函数类型 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
    
  • 21

    Swift 4中的测试显示了模拟器中的性能差异 . 我用“class func”创建了一个类,用“static func”创建了struct,并在测试中运行它们 .

    static func是:

    没有编译器优化,

    • 20% 更快
      启用优化-whole-module-optimization时,
    • 38% 更快 .

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

    以下是Swift 4 for Xcode 9的示例项目,如果你想测试自己https://github.com/protyagov/StructVsClassPerformance

  • 1

    我在操场上尝试了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(){
    
        }
    }
    

相关问题