【问题标题】:Difference between struct static func vs class static func in swift?swift中结构静态函数与类静态函数之间的区别?
【发布时间】:2017-08-25 10:33:48
【问题描述】:

我找不到class static functionstruct static function 之间的任何区别。据我所知,类静态函数不能被继承,并且 struct 没有继承选项。

请不要被类中的静态函数和类函数混淆。

class a {
    static func myMethod1() {
    }
}

struct a {
    static func myMethod1() {
    }
}

【问题讨论】:

  • 它们是一样的,除了static 然后你不能覆盖它,这就是它用于结构的原因,因为结构也不能被子类化
  • 它们是一样的。两者都是类型上的静态分派(编译时)方法。

标签: swift struct


【解决方案1】:

区别在于子类可以覆盖类方法但不能覆盖静态方法。

这是在 Playground 中测试的简单示例

class A{
    class func classFunction(){
    }
    static func staticFunction(){
    }
}

class B: A {
    // override successfully
    override class func classFunction(){
    }

    //Compile Error. Cannot override static method
    override static func staticFunction(){
    }
}

【讨论】:

    【解决方案2】:

    这有点牵强,但由于 classstruct 类型的引用 vs 值语义,在实现您想要使用类型的情况下存在细微差别方法 (static) 来改变类型的私有属性,给定一个类型的实例。同样,有点牵强,因为这侧重于实现细节的差异,而不是两者之间的具体差异。

    class 的情况下,可以为static 方法提供一个不可变引用,该方法又可以用来改变该类型的私有实例成员。对于struct,类型的实例自然需要作为inout 参数提供,因为更改值类型的实例成员的值也意味着更改实例本身的值。

    class A {
        private(set) var i: Int = 0
        static func foo(_ bar: A) { 
            bar.i = 42
        }
    }
    
    struct B {
        private(set) var i: Int = 0
        static func foo(_ bar: inout B) { 
            bar.i = 42  
        }
    }
    
    let a = A()
    var b = B()
    
    A.foo(a)
    print(a.i) // 42
    B.foo(&b)
    print(b.i) // 42
    

    【讨论】:

    • 当然Astatic func foo(_ bar: A) 基本上(忽略访问它所调用的元类型值的能力)相当于final func foo()Bstatic func foo(_ bar: inout B)基本上相当于mutating func foo() :) 我能想到的唯一其他区别是,通过将它们设为静态并为实例提供显式参数(而不是依赖于隐式self 参数),您可以获得以下能力:用不同的参数类型重载它们。
    • @Hamish 是的,确实是一个延伸(与static 不完全相关,而是值与引用类型的内在差异)。关于显式时重载可能性的好点!
    【解决方案3】:

    这些链接可以帮助您了解这些功能。作为@mipadi says(强调我的):

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

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

    What is the difference between static func and class func in Swift?

    Static vs class functions/variables in Swift classes?

    【讨论】:

    • 我知道,你可能错过了我的问题,这是关于 struct static func 与 class static func,而不是关于 static func 和 class func。
    • 如果您认为问题重复,请将其标记为重复
    • 请不要只引用另一个答案而不添加您自己的任何内容。引用很好(只要你give proper attribution),但你应该用它来支持你自己的想法。如果您觉得某个问题是重复的,那么请将其标记为这样(碰巧,它不是重复的 - 您引用的答案是在谈论 class 方法与 static 方法,问题是不是关于)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2019-07-06
    • 2012-10-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多