티스토리 뷰
에러 해결 일지/프로젝트 에러 해결
Cannot use instance member 'firstTextField' within property initializer; property initializers run before 'self' is available
JeroIOS 2022. 10. 13. 22:12StoryBoard로 간단한 계산기 앱을 구현하다가 발견한 에러.
class ViewController: UIViewController {
@IBOutlet weak var firstNumberTextField: UITextField!
@IBOutlet weak var secondTextField: UITextField!
@IBOutlet weak var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
// UITextField는 옵셔널형 변수이기 때문에 값이 없을 경우 "" 공백을 넣어주려고 한다.
let firstNumString = firstNumberTextField.text ?? ""
@IBAction func plusButtonTapped(_ sender: Any) {
// 더하기 기능 추가
}
}
IBOutlet으로 연결해준 firstNuberTextField를
nil coalescing으로 바로 값을 꺼내서 값이 있으면 firstNuberTextField를
값이 없으면 "" 공백을 넣어주려고 했다.
그런데 여기서 에러가 났다.
Cannot use instance member 'firstNumberTextField' within property initializer;
property initializers run before 'self' is available
살펴보니 프로퍼티가 없어서 인스턴스 멤버인 firstNumberTextField를 사용할 수 없다는 것이다.
내가 이해하기엔 초기화가 되는 중에 다른 값으로 다시 초기화하려니
메모리에 아직 없는데 값을 할당해서 이런 에러가 발생한 것 같다.
나는 빼기, 나누기, 곱셈도 구현할 것이기 때문에
전역 변수로 만들고 싶었다.
그래서 알아보니 lazy를 사용해주면,
변수가 처음 사용되기 전까지는 실행(연산)이 되지 않는다고 한다.
lazy var firstNumString = firstNumberTextField.text ?? ""
lazy var secondNumString = secondTextField.text ?? ""
lazy var firstNum: Int = Int(firstNumString) ?? 0
lazy var secondNum: Int = Int(secondNumString) ?? 0
lazy 특성상 사용되기 전까지는 변수에 값이 생기지 않기 때문에
let으로는 선언할 수 없다.
이렇게 에러 해결!!
다른 방법으로는 get, set 연산 프로퍼티를 만들어서 값을 넣어 해결해보고자 한다.
아니면 함수를 통해 액션 별로 숫자들을 던져줘도 좋은 해결책이 될 것 같다.
'에러 해결 일지 > 프로젝트 에러 해결' 카테고리의 다른 글
댓글