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

Вот класс SubtitleCustomField.

Class SubtitleCustomField: CustomCellField {
static var CellIdentifier: String!

  override init(frame: CGRect) {
  super.init(frame: frame)
  if CellIdentifier == "A" {
   //DO SOMETHINIG
  } else if CellIdentifier == "B" {
  //DO SOMETHING
  }

  }
}

Вне класса SubtitleCustomField мне в основном нужно получить доступ к статической переменной CellIdentifier, установить значение типа «A» и запустить оператор if для выполнения.

В другом классе, Custom class, я подтвердил, что могу получить доступ к статической переменной CellIdentifier следующим образом:

Class Custom: CustomViewController {
     SubtitleCustomField.CellIdentifier = "part1_subtitle"
}

На этом этапе я столкнулся с проблемой. В классе SubtitleCustomField я получаю сообщение об ошибке if CellIdentifier == "A", говоря

Статический член CellIdentifier нельзя использовать в экземпляре типа SubtitleCustomField.

Какой подход я могу использовать для достижения желаемого? Таким образом, я хочу установить переменную CellIdentifier вне SubtitleCustomField и запустить оператор if со значением, которое я установил в классе SubtitleCustomField.


person Kahsn    schedule 30.12.2015    source источник


Ответы (1)


Сообщение об ошибке пытается сообщить вам, что вы ссылаетесь на свойство типа (статическое свойство), как если бы это было свойство экземпляра. В инициализаторе SubtitleCustomField необходимо поставить перед "CellIdentifier" слово "SubtitleCustomField" точно так же, как если бы вы ссылались на него в другом месте.

override init(frame: CGRect) {
    super.init(frame: frame)
    if SubtitleCustomField.CellIdentifier == "A" {
        //DO SOMETHINIG
    } else if SubtitleCustomField.CellIdentifier == "B" {
        //DO SOMETHING
    }
}

Вы всегда должны ссылаться на свойства типа, используя имя типа, за которым следует "." за которым следует имя свойства.

person Marc Khadpe    schedule 30.12.2015
comment
У меня есть еще вопросы. (1) Мне нужно это сделать, так как это статическая переменная, верно? (2) Я прочитал некоторую информацию о статических переменных и немного запутался. В документации говорится, что статические переменные создаются лениво и устанавливают значение один раз, которое можно использовать во всех экземплярах класса. Если я буду продолжать изменять значение CellIdentifier в зависимости от моей ситуации, вызовет ли это какие-либо проблемы? - person Kahsn; 30.12.2015
comment
(1) Да. Идея состоит в том, что статическая переменная является свойством типа, поэтому вы получаете доступ к ней, используя точечную нотацию, как если бы она была свойством самого типа, а не экземпляра. (2) Нет. Инициализация выполняется только при первой попытке получить значение переменной. После этого вы можете установить все, что захотите. Если установить переменную до ее получения, ленивая инициализация не выполняется. - person Marc Khadpe; 30.12.2015
comment
Потрясающие. Большое спасибо, Марк! - person Kahsn; 31.12.2015