2016-02-11 6 views
0

Я хочу сделать некоторые операции, когда логические значения свойства вернутся к false и false к true.
Я установил для этого геттер, поэтому я могу выполнять эти операции с установщиком логического свойства.Exc_bad_access on BOOL Getter in swift

Но всегда сбой с кодом EXC_BAD_ACCESS = 2, может ли кто-нибудь помочь мне понять это, что не так, что я здесь делаю.

var reportActivityStarted:Bool { 
     set { 
      if self.reportActivityStarted { 
       //Operations when boolean is true 
      }else{ 
       //Operations when boolean is false 
      } 
     } 
     get{ 
      return self.reportActivityStarted 
     } 
    } 

Когда я изменяет это логическое значение, он выходит из строя при ГЭТ {

self.reportActivityStarted = true 
+1

Внутри набора, вы должны передать значение с помощью «новое_значение» и не должен иметь доступ к self.reportActivityStarted. – Shripada

+0

@Martin R - могу я знать, где вы нашли этот вопрос в stackoverflow. как я его искал, но не нашел нужным. – KiranJasvanee

+0

Тип '[swift] EXC_BAD_ACCESS get set' в поле поиска, он входит в список результатов. –

ответ

3

Как уже отмечалось @Unheilig вы генерируя бесконечный рекурсивный вызов. Infact getter reportActivityStarted рекурсивно ссылается на себя.

Если вы хотите запустить некоторую логику, когда свойство устанавливается или извлекается, то вы должны использовать свойства наблюдателя так:

var reportActivityStarted: Bool { 
    willSet(newValue) { 
     switch reportActivityStarted { 
     case true: print("reportActivityStarted is true before assignment") // <- your logic goes here 
     case false: print("reportActivityStarted is false before assignment") // <- your logic goes here 
     } 
    } 
} 
+1

@Unheilig: Нет, я думаю, вы должны восстановить свой ответ. Он объяснил, как создать приватную переменную для этого сценария. Это другой подход, и было бы неплохо объяснить это здесь. –

0

, если вы хотите использовать get, set вам, возможно, придется иметь другую переменную для сохранения значения на нем set и запросите его в get. как это:

var _reportActivityStarted = false 
var reportActivityStarted:Bool { 
     set { 
      _reportActivityStarted = newValue 
      if _reportActivityStarted { 
       //Operations when boolean is true 
      }else{ 
       //Operations when boolean is false 
      } 
     } 
    get{ 
     return _reportActivityStarted 
    } 
} 

Но от того, что я вижу в вас образец кода вам не нужно set и get вообще. вам просто нужно использовать didSet. как этого

var reportActivityStarted:Bool { 
      didSet { 
      if reportActivityStarted { 
       //Operations when boolean is true 
      }else{ 
       //Operations when boolean is false 
      } 
     } 
}