Javascript에서도 클로저란 개념이 있는데, Swift 에서도 클로저란 개념이 들어간다.
사실 아직 클로저란 개념이 잘 안잡히고 명확하게 정의를 내리기엔 아직 내 개발 지식이 부족하다....
클로저는 일종의 메소드의 개념과 유사한데 1급 객체로 전달 인자(Parameter) 변수(Variable), 상수(Constant) 등 저장 및 전달이 가능한 코드 블럭이라고 일단 정의를 내릴 수 있을 거 같다.
지금까지 함수라고 쓰였던 func들 다 클로저의 일종이라고 한다. 다만, 이름이 존재하는 클로저 정도?
그래서 이번 Swift 강의를 들으며 개념을 정확하게 잡으려 한다.
기본적인 클로저 문법
{ (매개변수 목록) -> 반환타입 in
실행코드
}
아까 정의 내렸던 1급 객체란 말이 조금 더 와닿을 문법이다. 전달 받을 인자, 변수, 상수 등을 매개변수 목록에 넣고 이를 반환할 return Type을 정의 후 그에 맞는 실행코드를 작성하면 될듯 하다.
코드 6 line 부터 10 line 까지 실행해보면 myName이란 변수는 반환된 String 값을 갖는다.
마찬가지로 코드 12 line 부터 15 line 까지 실행하여 보면 ybchar 라는 String 변수 yourName을 반환한다.
여기서 의문점이 들었다. 둘 다 똑같이 String을 반환하는데
9 line에서 ()를 왜 붙였는가...?
그래서 타입 정의를 제거하여 타입체크를 하였더니 yourName은 Function으로 찍히고
타입은 함수 형으로 return타입은 String이다 라고 찍혔다.
뭔가 더 찾아보니 () 내에 함수 연산이 들어간다고 한다. 확실한 정의를 알고 계신 분들은 댓글로 알려주십셔..
다음으로 맨 위 사진에 18 line 부터 21 line까지 실행하면 name이라는 String 파라미터를 가지고 String을 return한다는 의미로, "개발하는 차사원님"을 할당한 myRealNameString을 출력할 수 있을 것이다.
이번엔 인자로 completion이라는 클로저를 매개변수로 가지는 메소드 sayHi를 선언하였다.
클로저 completion의 타입은 void로 선언하였다.
메소드 내에는 시작을 알리는 출력문 실행을 체크할 sleep 함수, 클로저 completion를 선언하였다.
그리고 아래에 sayHi를 실행시키는데 매개변수 completion을 선언하였고 만약 14 line을 실행시키면
안녕하세요 출력문과 3초 뒤에 completion 클로저가 실행되어 "3초가 지났습니다. 1" 출력문 이벤트가 발동된다.
호출 방식은 sayHi() { 실행 코드 } 또는 sayHi { 실행 코드 } 이런식으로도 동작한다.
completion의 타입 정의는 void 상태이여서 가능하다고 본다.
마찬가지로 18 line, 22 line 도 똑같이 실행될 것이며,
3초마다 3초가 지났습니다. 1,2,3 출력된다.
이번엔 위와 다르게 completion에서 매개변수 데이터를 받는 클로저를
매개변수로 가지는 메소드 sayHiWithName를 선언하였다.
말이 좀 어려워서 그렇지 위에 completion에서 String 데이터를 매개변수를 받는다는 것이다.
메서드 내에는 똑같이 구현하였고, 아래 실행 구문이 조금 달라졌다.
이번엔 comment라는 인자를 받아 실행하는 것으로 completion 클로저 내에 comment:String 매개변수와 타입을 지정하여
출력문을 출력하도록 한다.
이미 sayHiWithName에 completion 클로저 String으로 타입 정의하였기에 굳이 String 정의를 하지 않아도 되고 comment만 선언하여도 질 실행된다. 또, completion이 선언되지 않아도 매개변수 순서에 따라 잘 실행이 된다.
추가로 마지막에 아예 매개변수를 선언하지 않는 방법인데 Swift 에서 클로저를 실행할 때 변수없이 선언해도 $0, $1, 이렇게 순서를 찾아 인식하여 동작한다고 한다.
이와 같이 매개변수로서 데이터를 두 개를 반환하는 클로저인데,
completion에 데이터 수만큼 타입 정의하여 선언할 수 있다.
그러면 클로저 내에 인자를 두 개를 선언해야하고 메서드 인자도 두 개 받도록 선언해야 한다.
위 마지막에 설명했었던 $0, $1 도 위와 같이 선언을 하면 첫 번째, 두 번째 .. 이렇게 실행되어 인자 수에 해당되는 배열 인덱스에 따라 파라미터를 호출할 수 있다.
'iOS > Swift 문법' 카테고리의 다른 글
Swift 기초 문법 - 클로저 (2) (1) | 2022.09.29 |
---|---|
Swift 기초 문법 - 프로퍼티 옵저버, 함수 매개변수, 제네릭 (0) | 2022.09.20 |
Swift 기초 문법 - for 반복문, 변수 unwrapping, struct와 class 차이 (0) | 2022.09.02 |
Swift 기초 문법 - 조건문, forEach 반복문, enum case (2) | 2022.09.01 |