在Swift中访问类中的静态variables
ClassName.staticVaribale
是访问类中的静态variables的唯一方法吗? 我想要像self
,但为了课堂。 像class.staticVariable
一样。
有两种方法从非静态属性/方法访问静态属性/方法:
-
正如你的问题所述,你可以前面的属性/方法名称的types:
class MyClass { static let staticProperty = 0 func method() { print(MyClass.staticProperty) } }
-
Swift 2:你可以使用
dynamicType
:class MyClass { static let staticProperty = 0 func method() { print(self.dynamicType.staticProperty) } }
Swift 3:你可以使用
type(of:)
:(谢谢@海西藏):class MyClass { static let staticProperty = 0 func method() { print(type(of: self).staticProperty) } }
如果你在一个静态属性/方法中,你不需要在静态属性/方法前添加任何东西:
class MyClass { static let staticProperty = 0 static func staticMethod() { print(staticProperty) } }
斯威夫特有一种方法可以使马塞尔的回答满足最挑剔的风格指导神
class MyClass { private typealias `Self` = MyClass static let MyConst = 5 func printConst() { print(Self.MyConst) } }
当你想访问关联的types声明时,这使得Self可以像协议一样可用。 我不确定Swift 1,因为从来没有尝试过,但在Swift 2中,它完美的工作
在未来的Swift 3版本(尚未发布)中,您可以使用Self
(是的,这是一个大写的)来引用包含的类。 这个build议被接受了,但是这个function还没有实现。
例如:
struct CustomStruct { static func staticMethod() { ... } func instanceMethod() { Self.staticMethod() // in the body of the type } }
来源: https : //github.com/apple/swift-evolution/blob/master/proposals/0068-universal-self.md
你可以通过定义一个自引用的typealias来解决这个问题。
class MyClassWithALongName { typealias CLASS = MyClassWithALongName static let staticFoo = "foo" func someInstanceMethod() -> String { return CLASS.staticFoo } }
虽然风格指导神可能不赞成。