Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[220805] TIL #92

Closed
Taehyeon-Kim opened this issue Aug 5, 2022 · 1 comment
Closed

[220805] TIL #92

Taehyeon-Kim opened this issue Aug 5, 2022 · 1 comment
Assignees

Comments

@Taehyeon-Kim
Copy link
Owner

Taehyeon-Kim commented Aug 5, 2022

클로저

  • 함수의 형태와 함수의 호출 구조를 잘 이해한다면 쉽게 받아들일 수 있을 것 같다.
// 다음도 잘 구분할 수 있으면 클로저의 이해를 도울 수 있다.
func example() {}

example       // 함수 자체
example()     // 함수 호출

기본 구조

클로저 헤더와 클로저 바디 부분을 잘 이해하자.

{ (매개 변수) -> 리턴 타입 in	// 클로저 헤더
  실행 구문			// 클로저 바디
}

인라인 클로저 (inline closure)

// 코드를 생략하지 않고 클로저 구문 씀, 함수의 매개변수 내에 클로저가 그대로 들어간 형태
// => 인라인 클로저
getStudyWithMe(study: { () -> () in
    print("주말에도 공부하기")
})

트레일링 클로저 (trailing closure)

// 함수 뒤에 클로저가 실행
// => 트레일링 클로저(= 후행 클로저)
getStudyWithMe() { () -> () in
    print("주말에도 공부하기")
}

매개변수(+ 반환값)가 있는 클로저

let result = { (number: Int) -> String in
    return "행운의 숫자는 \(number)입니다."
}

클로저 표현식 변환 과정

randomNumber(result: { (number: Int) -> String in
    return "행운의 숫자는 \(number)입니다."
})

randomNumber(result: { (number) in
    return "행운의 숫자는 \(number)입니다."
})

randomNumber(result: { (number) in
    "행운의 숫자는 \(number)입니다."
})

randomNumber(result: {
    "행운의 숫자는 \($0)입니다."
})

randomNumber {
    "행운의 숫자는 \($0)입니다."
}

Non-escaping, Escaping 클로저

Non-Escaping 클로저

  • 함수의 실행이 종료되기 전에 실행되는 클로저

Escaping 클로저

  • 클로저가 함수의 인자로 전달됐을 때, 함수의 실행이 종료된 후 실행되는 클로저
  • 서버 통신이 끝난 후에 외부에 값을 전달하고자 할 때 사용하고는 함 (이 예에 한정되지 말고, 원리를 이해하는 것이 중요)

고차함수

  • map, filter, closure
  • 일반 반복문보다 속도가 빠름
  • CFAbsoluteTimeGetCurrent() 메서드로 시간 차이를 측정해보자.
  • 진짜 고차함수를 잘 쓰는 것이 중요하다는 것을 많이 느끼고 있다.

외부함수, 내부함수

  • 외부함수와 내부함수의 생명주기의 관찰도 중요한 부분인 것 같다.
  • 일반적으로 함수가 종료되면 메모리에서 내려가게 된다.
  • 그렇다면 외부함수가 종료되었을 때 그 내부에 존재하던 내부함수 또한 메모리에서 내려가야 하는 것이 아닐까?
  • 그런데 내부함수의 생명주기는 외부로부터 차단되어 있다. 이를 은닉성이라고 표현한다.
  • 내부함수를 외부함수에서 반환해서 어떠한 변수나 상수에 담아서 사용하게 되면 외부에서도 접근할 수 있게 된다.
  • 이렇게 되면 외부함수가 종료되었다고 하더라도 내부함수는 곳곳에서 사용할 수 있게 된다.
  • 떠돌이가 되는 것이다.
  • 클로저를 사용하게 되었을 때, 주변 환경에 포함된 변수나 상수가 메모리에 남아있을 수 있는 것인데 이를 값이 캡처되었다고 표현한다.
  • 값의 캡처에 대해서는 다시 한 번 살펴보도록 하자.

필요에 의해 역할과 관심사를 분리하다보면 자연스럽게 아키텍처와 패턴을 찾아보게 되고, 그런 코드 작성 방식에 가까워진다.

이후에 공부는 해야겠지만 너무 얽매이지 말자.

네트워크 코드에 관해

  • Controller에 작성하는 코드 라인 수가 증가하면서 역할과 코드의 분리에 대해서 생각을 하게 된다.
  • 보통 네트워크 코드는 따로 분리해서 작성하는 편이며, Manager, Service 등등의 다양한 단어를 붙여서 클래스를 구성한다.
  • 통신 받아온 값을 Controller에서 사용하기 위해 escaping closure를 사용한다.
  • indicator 또는 progress bar를 사용하여 ux를 고려할 필요가 있다.
@Taehyeon-Kim Taehyeon-Kim self-assigned this Aug 5, 2022
Taehyeon-Kim added a commit that referenced this issue Aug 5, 2022
- 네트워크 코드 분리
- 싱글톤 패턴
- 탈출 클로저
Taehyeon-Kim added a commit that referenced this issue Aug 5, 2022
@Taehyeon-Kim
Copy link
Owner Author

swift-12

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant