iOS 개발일지
0707 새싹 4회차 정리 본문
iOS 앱 개발자 데뷔 과정 4회차
#0. Memo
- 컴파일 에러와 런타임 에러
컴파일 에러 : 코드에 에러가 있어 실행이 안되는 상태
런타임 에러 : 실행중에 일어나는 예상치 못한 에러
- 옵셔널과 옵셔널 체이닝
var a: String?
여기서 상수 a는 Optional String 타입이다.
a에 값이 있는지 없는지(nil) 모른다는 것을 의미하며, 옵셔널이라는 랩으로 감싸져 있는 상태이기 때문에 코드에서 사용할 땐 옵셔널을 벗겨주어야 한다.
옵셔널을 가장 쉽게 벗기는 방법은 a! 이렇게 뒤에 !를 붙이는 것인데, 위험한 방법이므로 값이 확실한 경우에만 사용해야 한다.
값이 nil인지 아닌지에 따라 다른 실행을 하고 싶을 땐 조건문을 사용할 수 있겠지만, 아래와 같이 훨씬 더 간단한 코드로 가능하다.
이를 옵셔널 체이닝이라고 한다.
userTextField?.placeholder = “내용을 작성해주세요”
여기서의 ?는 ‘물어보는 것’ 이다. 따라서 옵셔널을 뜻하는 ?랑은 다른 의미이다.
?를 만났을 때 nil이라면 그 뒤에 오는 코드가 실행되지 않는다.
불필요한 옵셔널 체이닝을 방지하고 싶을 땐, 초기화할 때 논옵셔널 타입으로 어노테이션 해주면 된다.
- 버튼을 코드로 디자인하면?
func designButton(buttonOutletVariableName buttonName: UIButton)
buttonOutletVariableName: 외부 매개변수, Argument Label (생략 가능)
buttonName: 내부 매개변수, Parameter Name
UIButton: Argument
- _ : 와일드 카드 식별자
생략하고 싶을땐 이 와일드 카드 식별자( _ )를 사용하면 된다.
너무 많이 사용하면 헷갈리기 때문에 한개정도 쓰는 것이 원칙이다.
- 코드를 줄여보자! @IBAction 다중연결과 Any
@IBAction 함수는 여러개의 객체와 한번에 연결할 수 있어서 같은 기능을 하는 객체가 여러개라면 코드를 줄일 수 있다.
꼭 같은 종류의 객체일 필요도 없다. sender 타입을 Any로 설정하면 얼마든지 코드 작성이 가능하다.
하지만 자주 사용하지는 않는다고 한다.
- 폰트 사이즈가 줄어들어도 되니까 잘리지 않았으면 좋겠어
그럴 땐 Label의 Autoshrink를 설정하면 된다.
Scale과 Size 둘중 하나를 선택할 수 있고, TextField에서도 설정 가능하지만 선택지는 Size 하나이다.
#1. Checklist
- Cocoa Touch Framework
iOS 개발을 위해 사용하는 통합 프레임워크로 UIKit, Foundation 등을 포함하고 있다.
새 파일을 생성했을 때 기본적으로 써져있는 코드가 아주 조금 다를 뿐, SwiftFile과 완전히 동일하다.
Objective-C Runtime을 기반으로 하며 Objective-C의 최상위 클래스인 NSObject를 상속한다.
- BreakPoint
디버깅을 할 때 쓰는 기능으로, 선택한 지점부터 아래의 코드를 실행하지 않는다.
코드 왼쪽 Line을 누르면 활성화/비활성화가 가능하며, 우클릭으로 삭제할 수 있다.
시뮬레이터 실행 중 디버그 영역에서 해당 버튼으로 다음 BreakPoint로 단계를 넘어가며 테스트할 수 있다.
- Function vs Method
같은 대상을 지칭하는 다른 호칭
Function이 Class, Struct, Enum 내에 선언이 되어있으면 Method라고 한다.
- Parameter vs Argument
같은 대상을 지칭하는 다른 호칭
Parameter(매개변수)는 함수의 정의에서, Argument(전달인자)는 함수에 호출에서 사용하는 호칭이다.
Argument. 즉 전달인자는 말 그대로 전달하는 값을 의미한다. 함수를 호출하면 Argument Label이 자동완성된다.
Parameter. 매개변수는 위에서 전달된 인자를 받아들이는 변수이다. 따라서 함수 내의 연산에 사용된다.
- Optional
#0. Memo 옵셔널과 옵셔널 체이닝 참고
- Any
#0. Memo 코드를 줄여보자! @IBAction 다중연결과 Any 참고
- Outlet Collection
[2회차 정리](https://eun-dev.tistory.com/3) 참고
#2. Assignment
- 과제1 TextField ReturnKey
- TextField에서 텍스트를 입력하다 키보드 리턴키(Enter)를 누르면 키보드가 내려가게 구현
우선 이걸 구현하기 위해서는 UITextFieldDelegate가 필수이다.
직접 상속시켜도 되지만 이번에는 extension으로 확장시켜 보았다.
resignFirstResponder()로 텍스트필드의 현재 상태를 포기했다는 요청을 리시버에게 알려줌으로써, 키보드가 내려가게 된다.
textField.resignFirstResponder() 대신 veiw.endEditing(true)를 사용해도 문제가 없지만, 좀 더 정확하게 textField만 조작하는 것이 좋지 않을까 생각한다.
extension은 textFieldShouldReturn을 사용하기 위한 밑작업 같은거고, 여기서 실제로 동작하는 부분은 func이다.
그럼 이제 끝인거같지만 아직 할 일이 조금 더 남아있다.
userTextField의 Delegate를 self로 지정해야 한다.
왼쪽처럼 viewDidLoad 밑에서 지정해도 되고, 오른쪽처럼 didSet을 이용해도 된다.
didSet에 대해 궁금하다면 여기서 잠깐 Property Observer에 대해 알아보자.
Property Observer는 특정 프로퍼티를 계속 관찰하고 있다가 프로퍼티의 값이 변경되면 이 값을 알아차리고 반응한다.
이 Property Observer는 총 두 가지 옵션이 있는데, 그게 willSet과 didSet이다.
willSet : 값이 저장되기 직전에 호출된다.
didSet : 새 값이 저장된 직후에 호출된다.
즉 didSet을 사용하면 어디에서 값이 변경되든 프로퍼티 옵저버가 이를 감지하고, 값이 변경된 직후에 didSet 블럭 내의 코드를 실행한다.
지금 사용하는 코드에서는 딱히 이점이 없어 보이기도 하지만 값이 여러 곳에서 여러번 바뀌어야 한다면 유용할 것 같다.
- TextField Action 연결 시 Event를 DidEndOnExit로 설정해 동작 구조를 확인
처음에는 이 과제를 보고 '어라? 뭘 확인하라는거지? Action을 연결한 다음엔 블럭 안에 뭔가 써줘야 하지 않나...?' 라고 생각했다.
아무것도 써주지 않아도 된다.
이걸 이렇게 간단하게 설정할 수 있다는것에 놀랐다.
TextField를 Action 연결을 할 때 Event를 누르면 저렇게 여러가지 옵션이 뜨는 것을 볼 수 있는데, 기본값은 Editing Did End로 되어 있다.
이걸 Did End On Exit으로 변경하면 키보드에서 return 키를 누르면 자동으로 편집이 종료되어 키보드가 내려가게 된다.
뭘 추가하고, 작성할 필요 없이 아주 간단하게 설정할 수 있어서 매우 편리하다...!
이미 위에서 써놓은 return에 대한 코드를 주석처리하거나 지워서 돌리려니 자꾸만 크래쉬가 발생했다ㅠㅠ
그렇다고 지우지 않으면 DidEndOnExit이 어떻게 동작하는지 알 수가 없고... 애를 좀 먹었는데 여러번 반복하다보니 해결됐다.
- 과제2 View isHidden
-탭제스쳐를 클릭 시 상단 View가 토글 형태로 숨겼다 보여졌다 하는 기능 구현

먼저 Gesture의 @IBAction 함수 밖에서 var isHieedn = false로 초기화하고, 제스쳐를 클릭했을 때 상태가 바뀔 수 있도록 해줬다.
그리고 바뀐 상태에 따른 액션을 조건문으로 설정해주면 끝!
- 과제3 3회차 과제 수정
- 함수와 매개변수, 옵셔널의 개념을 이해하고 활용하여 3회차 과제 코드 수정
이 과제는... 어쩌다보니 어제오늘 끙끙거리면서 매개변수와 옵셔널을 이미 사용해서, viewDidLoad에 있는 코드들만 종류별로 함수에 옮겨 정리만 해주었다. 매달렸던 보람이 있는 것 같아 뿌듯했다ㅎㅎ
# 그 외
색을 투명하게 하고 싶다면 .clear를 사용하자
# Plus
- 버튼 타이틀 폰트 굵기 변경
signUpButton.titleLabel?.font = .boldSystemFont(ofSize: 20)
어제 작성한 titleLabel과 거의 동일한 코드인데, 쓰려고 하니 저렇게 ?가 멋대로 붙어서 당황했었다...
내가 뭘 잘못 한건가, 이건 쓰면 안되는건가? 싶어서 쓰다 말았는데 바로 오늘 강의에서 옵셔널체이닝에 대해 배웠다.
한줄로 간단 해결! 너... 알고보니 좋은 녀석이었구나...!
- 회원가입 버튼 클릭 시 조건 판단(이메일과 비빌번호 필수 기입, 비밀번호 최소 6자리 이상)
어제 이 미션을 못한게 너무 아쉬웠어서, 오늘 데일리 과제를 하기 전에 어제 과제를 다시 켰다.

생각나는대로 써봤는데 조금만 다듬으면 괜찮을지도...?

오늘 배운 옵셔널체이닝대로라면 TextField가 비어있으면 뒤의 코드가 실행되지 않을테니 강제로 옵셔널을 해제해도 괜찮을 것 같았다.
두근거리며 시뮬레이터를 켜봤는데, 이게 진짜 되잖아...?
이렇게 빨리 될줄 몰랐는데 감격스럽다ㅠㅠ
- return을 누르면 자동으로 resultLabel에 반영이 되게 해볼까?
위의 과제1 TextField ReturnKey 를 작성한 것까진 좋았는데 sendButton을 한번 더 눌러야 한다는게 영 마음에 안들었다.
만약 내가 사용자라면, 내용을 확정시키려고 누른 return인데 바로 반영이 안된다는게 불편할 것 같았다.
다행히 아주아주 쉬운 방법으로 해결할 수 있었다.
아까 사용한 func textFieldShoulReturn 안에서 sendButtonClicked를 호출해주기만 하면 된다 :)
# 더 공부하고 싶은 부분... 오늘은 늦었으니 이만 잡시다
Outlet Collection으로 뷰객체들을 연결할 때는 weak를 사용하지 않는 이유... 너무 궁금하다
'SeSAC iOS 데뷔과정 2기' 카테고리의 다른 글
0710 1주차 마무리 (0) | 2022.07.10 |
---|---|
0708 새싹 5회차 정리 (0) | 2022.07.08 |
0706 새싹 3회차 정리 (0) | 2022.07.06 |
0705 새싹 2회차 정리 (0) | 2022.07.05 |
0704 새싹 1회차 정리 (0) | 2022.07.04 |