티스토리 뷰

TIL

[TIL] 2022 / 07 / 07

희철 2022. 7. 7. 21:00

BreakPoint

 

의도적으로 프로그램을 일시정지.

주로 오류를 발견하기 위해 사용됨.

이렇게 왼쪽 숫자를 누르면 브레이크가 걸림.

 

파일 생성 시 swift파일 vs cocoaTouch파일

 

swift파일을 생성했을 땐 Foundation프레임워크가 임포트되어있고, 코코아터치의 경우 UIKit 프레임워크가 임포트되어있음.

어떤 것으로 생성하든지 상관없음. 단지, 샘플용으로 적혀있는 코드가 다를뿐.

 

Function

 

코드를 작성하다보면 반복적으로 작성되는 부분이 있는 경우가 있음.

이때 함수를 선언해서 호출만하면 효율적으로 작성 가능.

 

함수를 보면 애플에서 이미 정의해놓은 함수가 있는 반면, 우리가 직접 정의하는 사용자 정의 함수(UDF)도 있음.

단, 함수를 선언하는 경우엔 이름, 기능, 실행 타이밍을 직접 정의해주어야함.

 

함수를 Method라고 부르는 경우가 있는데, function과 비교해서 상황과 위치에 따라 용어가 다를 뿐이지 역할은 같음.

 

그럼 어떨때 Function이라고 부르고, 어떨때 Method라고 부를까?

 

Function은 모듈 전체에서 전역적으로 사용할 수 있는 함수 -> viewDidLoad같은 함수를 생각하면 됨.

Method는 클래스, 구조체, 열거형 등 특정 타입과 연관되어 사용하는 함수를 의미.

 

예를 들면, 뷰컨트롤러 클래스 안에 우리가 따로 텍스트의 색을 바꿔주는 함수를 선언한 경우엔 method

 

또한 클래스, 구조체, 열거형에서 생성된 객체를 인스턴스라고 함.

클래스, 구조체, 열거형 안에서 만들어진 변수 또는 상수를 프로퍼티

 

함수를 구현할 때 괄호 안에 작성해 주는 것이 매개변수.

위처럼 함수를 선언하고 아래처럼 호출함.

이때 :를 기준으로 왼쪽을 parameter, 오른쪽을 argument라고 함.

즉, targetBtn이 Parameter이고 sendBtn이 Argument

 

정리해보면, 

Argument(전달인자)는 함수를 호출하는 경우에 전달하는 실제 값을 의미.

Parameter(매개변수)는 전달인자를 받을 변수 또는 함수의 정의에 포함되는 변수를 의미.

 

다음으로, 함수 선언하는 부분을 보면 괄호 안에 파란 색 글씨로 적힌 부분과 하얀색 글씨로 적힌 부분을 볼 수 있음.

파란색으로 적힌 글씨는 외부 매개변수(Argument Label)이고, 하얀색으로 적힌 글씨는 내부 매개변수(Parameter Name)

 

외부 매개변수와 내부 매개변수를 나누지않고 하나로만 선언한다면, 같은 값으로 설정됨.

 

근데 외부 매개변수에 의미를 드러내는 것은 좋지만 코드가 너무 길어지는 것을 볼 수 있음.

이때 외부 매개변수에 "_"를 이용하여 Argument Label을 생략할 수 있음.

_ 를 와일드 카드 식별자라고 함.

 

Any

 

스위프트 문서를 보면,

Any는 함수 타입을 포함한 모든 타입의 인스턴스를 나타낼 수 있다고 함.

 

탭 제스처와 버튼이 같은 기능을 할 경우에, IBAction을 선언할 때 sender 타입을 any로 하게 되면 하나의 IBAction 메서드만으로 이용 가능.

tapView의 sender타입을 Any로 한 뒤 탭 제스쳐와 버튼 액션을 모두 tapView와 연결해주었더니 아래와 같이 제대로 동작함.

 

Outlet Collection

 

IBOutlet을 선언하고 UI를 만질 때 반복적인 작업이 있을 때가 있음.

여러 줄의 코드를 계속 복사 붙여넣기해도되지만 코드가 길어지므로 반복문을 사용하거나 Outlet Collection을 사용할 수 있음.

 

Outlet Collection을 선언할 때는 IBOutlet을 선언할 때와 똑같지만 connection을 OutletCollection으로 설정하면됨.

선언한 뒤 배열에 값을 추가하고 싶다면 거터부분에 있는 동그라미를 추가할 오브젝트와 연결만 하면됨.

-> 이때 weak이 아니라 strong으로 선언이 되는데 이유는 아직 메모리부분은 잘 이해가 안돼서 이후에 알아봐야할듯

 

내 기기를 시뮬레이터로 사용

 

연결 후 시뮬레이터에서 내 디바이스를 찾아서 빌드하면됨.

 

처음에 신뢰할 수 없는 기기라는 오류가 뜨는데,

설정 - 일반 - VPN 및 기기 관리 - 앱 누르고 신뢰하게 하면됨.

 

______________________________________________________________________________________________________

 

textField에 텍스트를 입력하고 return(엔터키)를 눌렀을 때 키보드 내리기

 

1. UITextFieldDelegate 프로토콜을 채택해서 textFieldShouldReturn메서드 이용.

 

Protocol은 지켜야할 규칙 또는 약속이라고 생각하면 됨.

정해진 규칙, 즉 프로토콜을 클래스, 열거형, 구조체에서 채택해서 구현 가능.

-> 프로토콜은 프로퍼티나 메서드 등을 정의만하고, 채택한 곳에서 구현하는 것임.

 

Delegate은 '대리자'라는 뜻. 즉, A객체의 일을 B객체가 대신 해주는 느낌.

 

Delegate를 사용하기 위해 몇 가지 과정 필요.

 

가장 먼저, 프로토콜 채택(UITextFieldDelegate)

다음으로, 위임자 지정

inputTextField.delegate = self

위와 같은 코드를 볼 수 있는데, delegate가 주는 메세지를 누가 받을 것인지에 대한 코드.

즉, 뷰에 대한 작업을 뷰 컨트롤러가 해준다고 생각하면 될듯.

 

마지막으로 함수 구현

채택한 프로토콜안에 정의되어있는 메서드들 중 원하는 것에 대해 함수를 구현하면됨.

나는 return버튼을 눌렀을때에 키보드가 내려가도록 구현함.

 

resignFirstResponder

 

"Notifies this object that it has been asked to relinquish its status as first responder in its window."

-> 윈도우에서 first responder상태를 포기하라고 알려준다는 의미.

 

그렇다면 first responder는 무슨 의미일까?

 

앱이 이벤트를 받으면, UIKit은 적절한 Responder를 지정해서 이벤트를 넘겨서 처리를 하게 하는데, 이 처음으로 이벤트를 받는 Responder를 First Responder라고 함.

(출처: https://jcsoohwancho.github.io/2019-07-25-Responder와-Responder-Chain,-그리고-First-Responder/)

=> 더 자세하게 봐야함.

 

아무튼 텍스트필드의 현재 상태를 포기하게되면 키보드가 내려가게 됨.

 

이때 궁금한게 생김.

만약 다른 A라는 다른 텍스트필드를 하나 더 만들고 똑같이 A.delegate = self라고 작성했는데 return메서드에 원래 있던 inputTextField에 대해서만 resignFirstResponder를 해준다면, A의 키보드에서 리턴을 눌렀을때 아무일도 안일어나는지 궁금했음.

 

실제로 해보니 아무일도 일어나지않음. 즉, 내부 매개변수인 textField로 만들어줘야 delegate를 이용해 같은 메서드를 이용할 수 있음.

 

2. textField 이벤트의 DidEndOnExit 이용

 

버튼의 IBAction과 동일하게 연결해서 선언하지만 event를 didEndOnExit으로 바꾼 뒤 선언.

-> 위의 방법과 동일하게 리턴키를 눌렀을때 키보드 내려감.

 

 

버튼을 이용해 뷰 숨기기

@IBAction func hidingViewBtn(_ sender: UIButton) {
    if topView.isHidden {
        topView.isHidden = !topView.isHidden
    } else {
        topView.isHidden = !topView.isHidden
    }
}

버튼을 눌렀을 때, 뷰의 isHidden값이 true라면 그 반대값을 주도록함.

 

'TIL' 카테고리의 다른 글

[TIL] 2022 / 07 / 09  (0) 2022.07.09
[TIL] 2022 /07 / 08  (0) 2022.07.08
[TIL] 2022 / 07 / 06  (0) 2022.07.07
[TIL] 2022 / 07 / 05  (0) 2022.07.05
[TIL] 2022 / 07 /04  (0) 2022.07.05
댓글
최근에 올라온 글
Total
Today
Yesterday