Является ли ClassName.staticVaribale
единственным способом доступа к статической переменной внутри класса? Я хочу что-то вроде self
, но для класса. Как class.staticVariable
.
Доступ к статическим переменным в классе в Swift
Ответ 1
Существует два способа доступа к статическому свойству/методу из нестатического свойства/метода:
-
Как указано в вашем вопросе, вы можете префикс имени свойства/метода с типом:
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:)
(спасибо @Sea Coast of Tibet):class MyClass { static let staticProperty = 0 func method() { print(type(of: self).staticProperty) } }
Если вы находитесь внутри статического свойства/метода, вам не нужно префикс статического свойства/метода:
class MyClass {
static let staticProperty = 0
static func staticMethod() {
print(staticProperty)
}
}
Ответ 2
В Swift есть способ заставить Marcel ответить на удовлетворение даже самых придирчивых богов-стилей
class MyClass {
private typealias `Self` = MyClass
static let MyConst = 5
func printConst() {
print(Self.MyConst)
}
}
Это делает Self доступным, как в протоколах, когда вы хотите, чтобы объявление связанного типа с доступом. Я не уверен в Swift 1, потому что никогда не пробовал, но в Swift 2 он отлично работает
Ответ 3
В будущей версии Swift 3 (еще не выпущенной) вы можете использовать Self
(да, это с капиталом) для ссылки на содержащий класс. Предложение для этого было принято, но функция еще не реализована.
Например:
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
Ответ 4
Вы могли бы обойти это, указав сами типы ссылок.
class MyClassWithALongName {
typealias CLASS = MyClassWithALongName
static let staticFoo = "foo"
func someInstanceMethod() -> String {
return CLASS.staticFoo
}
}
Хотя боги-стилисты не могут одобрить.
Ответ 5
Мне не нравится тип typealias в этом случае. Мое обходное решение:
class MyClass {
static let myStaticConst: Int = 1
var myStaticConst:Int {
return type(of: self).myStaticConst
}
func method() {
let i:Int = myStaticConst
}
}