티스토리 뷰

StoryBoard로 간단한 계산기 앱을 구현하다가 발견한 에러.

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 연산 프로퍼티를 만들어서 값을 넣어 해결해보고자 한다.

아니면 함수를 통해 액션 별로 숫자들을 던져줘도 좋은 해결책이 될 것 같다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함