본문 바로가기

MOBILE/ios

[iOS] TextField.text는 nil이 되지도 않으면서 왜 optional일까

ios 개발에서 사용자의 text를 입력받는 swiftUI는 textField이다.

오늘 프로젝트 개발 중, textField 값이 없을 때와 초기 상황에서의 이벤트를 처리하기 위해 코드를 작성하고 있었는데

알 수 없는 부분을 발견했다.

 

xcode에서 UIlabel의 text를 quick help로 살펴보면 다음과 같은 문서를 볼 수 있다.

즉, textField의 text는 분명 optional type으로 정의되어 있다.

정확하게 말하면 옵셔널 연산 인스턴스 프로퍼티이다.

 

애플 문서에 나와있는 text 속성 설명

 

그런데 문제는 text 속성은 기본으로 "" 빈 문자열을 return 한다는 것이다.

그렇다면 nil은 언제 반환되는 것일까?

 

 

 

1. 유저 입력이 없는 초기 상황

처음에 view가 load되고 textField의 text 값을 테스트 해보았다.

 

print(txtField.text?.isEmpty)
print(txtField.text)

 

결과는 다음과 같다.

 

Optional(true)
Optional("")

 

즉 비어있지만, text의 get 값으로는 "" 빈 문자열을 return 한다는 것이다.

 

 

 

2. text 속성에 의도적으로 nil 대입

아래와 같이 의도적으로 nil을 넣으면 어떻게 될까?

 

txtField.text = nil
print(txtField.text?.isEmpty)
print(txtField.text)

 

결과는 다음과 같다.

 

Optional(true)
Optional("")

 

분명 text 속성으로 nil을 넣었음에도 불구하고 빈 문자열이 반환되었다.

 

 

 

3. 초기 값이 있는 상황

그렇다면 초기값이 있는 상황에서는 어떻게 될까?

 

당연하게도 다음과 같이 nil이 반환되지 않는다.

 

 

 

 

4. 유저 입력이 있는 상황

유저 입력이 생긴 상황에서는 어떻게 될지 뻔하지만 테스트를 해보자.

버튼을 추가하고 이에 대한 액션 함수로 text 속성을 print 하도록 했다.

 

3번 결과와 마찬가지로, 당연하게도 다음과 같이 nil이 반환되지 않는다.

 

 

 

 

4-1. 유저 입력이 있었는데요, 없었습니다.

만약 4번 경우에서, 유저가 입력을 하지 않고 버튼을 눌러 액션함수가 실행된다면 nil이 반환이 될까?

 

결과는 다음과 같이 나온다.

 

Optional(true)
Optional("")

 

유저 입력이 공백인 상황에서도 반환값은 빈 문자열이다.

 

 

 

5. 그렇다면 왜 굳이 optional 이어야 하는가?

1~4의 결과를 통해 UITextField의 text 속성은 optional이지만 nil이 반환되는 경우가 없음을 확인할 수 있었다.

그렇다면 nil이 되지도 않는데 왜 text의 속성은 optional 일까?

그것은 objective-c 와의 호환성을 위한 것이라고 한다.

objective-c 에서는 text가 nil이 될 수 있었기 때문에 아마 코코아 터치 프레임워크의 호환성 면에서도 이를 optional로 선언해둔 것 같다.

하지만 연산 프로퍼티의 get 으로 나온 반환 값은 절대 nil이 되지 않는다는 점

값이 없다면 nil이 아니라 빈 문자열이 나온다는 것을 기억하면 좋을 것 같다.

그 와중에도 IsEmpty 속성은 true가 된다는 것도 함께 기억해야 한다.