以下代码在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)
8条答案
按热度按时间new9mtju1#
static
和class
都是将方法与类相关联,而不是与类的示例相关联,区别在于子类可以覆盖class
方法;它们不能覆盖static
方法。class
属性的作用方式相同(子类可以覆盖它们)。hs1ihplo2#
我试了一下mipadi的回答和在playground上的评论。并且想到了分享它。给你。我认为mipadi的回答应该被标记为接受。
xzlaal3s3#
关于OOP,答案太简单了:
子类可以覆盖class方法,但不能覆盖static方法。
除了你的文章之外,如果你想声明一个class变量(就像你声明
class var myVar2 = ""
一样),你应该按如下所示做:lf3rwulv4#
Swift 4中的测试显示了模拟器中的性能差异。我用“class func”创建了一个类,用“static func”创建了一个结构,并在测试中运行了它们。
静态函数为:
***20%**的速度,无需编译器优化
***38%**当优化-整个模块-优化被启用时。
然而,在iOS 10. 3下的iPhone 7上运行相同的代码,表现出完全相同的性能。
如果你想测试自己https://github.com/protyagov/StructVsClassPerformance,这里是Swift 4中Xcode 9的示例项目
cnh2zyt35#
我在我的一个项目中也遇到了这个困惑,发现这个帖子很有帮助。在我的操场上也试过了,这里是总结。希望这能帮助一些人处理
static
,final
,class
类型的存储属性和函数,覆盖类变量等。这是测试样本:
wi3ka0sx6#
Swift类与静态
Reference vs Value Type(https://stackoverflow.com/a/59219141/4770877)
class
在Reference Type
内部使用(类、函数):*是否可以被子类覆盖
static
在Reference Type
(类、函数)和Value Type
(结构、枚举、元组)内部使用:*不能被子类更改
zxlwwiss7#
还有一点不同
class
只能用于定义计算类型的类型属性。如果需要存储类型属性,请改用static
。可以使用static关键字定义类型属性。对于类类型的计算类型属性,可以改用class关键字以允许子类重写超类的实现。
https://docs.swift.org/swift-book/LanguageGuide/Properties.html
axzmvihb8#
除了上述答案之外,静态方法是静态调度,这意味着编译器知道在运行时将执行哪个方法,因为静态方法不能被覆盖,而类方法可以是动态调度,因为子类可以覆盖这些方法。