以下代码在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 回答
添加到上面的答案静态方法是静态分派意味着编译器知道哪个方法将在运行时执行,因为静态方法不能被覆盖,而类方法可以是动态分派,因为子类可以覆盖它们 .
还有一个区别 .
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."
static
和class
都将方法与类相关联,而不是类的实例 . 不同之处在于子类可以覆盖class
方法;他们无法覆盖static
方法 .class
属性理论上将以相同的方式起作用(子类可以覆盖它们),但它们在Swift中是不可能的 .关于 OOP ,答案太简单了:
子类可以覆盖 class 方法,但不能覆盖 static 方法 .
除了你的帖子,如果你想声明一个 class 变量(就像你做了
class var myVar2 = ""
),你应该这样做:我在我的一个项目中也遇到了这个困惑,发现这篇文章非常有帮助 . 在我的操场上尝试过同样的事情,这是摘要 . 希望这可以帮助那些存储属性和函数类型
static
,final
,class
,覆盖类变量等的人 .以下是测试样本:
Swift 4中的测试显示了模拟器中的性能差异 . 我用“class func”创建了一个类,用“static func”创建了struct,并在测试中运行它们 .
static func是:
没有编译器优化,
启用优化-whole-module-optimization时,
但是,在iOS 10.3下在iPhone 7上运行相同的代码会显示完全相同的性能 .
以下是Swift 4 for Xcode 9的示例项目,如果你想测试自己https://github.com/protyagov/StructVsClassPerformance
我在操场上尝试了mipadi的回答和评论 . 并想到分享它 . 干得好 . 我认为mipadi的答案应该标记为已被接受 .