Подтвердить что ты не робот

Доступ к статическим переменным в классе в Swift

Является ли ClassName.staticVaribale единственным способом доступа к статической переменной внутри класса? Я хочу что-то вроде self, но для класса. Как class.staticVariable.

4b9b3361

Ответ 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
   }
}