Apr 12, 2021, TIL (Today I Learned) - Closure, 고차함수

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

학습내용


Closure

  • 코드의 블럭
  • 일급객체
    • 전달인자, 변수, 상수 등으로 저장, 전달이 가능
  • 함수: 이름이 있는 클로저
  • 매개변수, 반환 타입 생략 가능
  • return 키워드 생략 가능
  • 축약된 전달인자 이름을 사용 가능
  • 후행 클로저

Closure 기본 형태

{ (매개변수들) -> 반환 타입 in
	실행코드
}
Screen Shot 2021-04-12 at 10 17 25 AM Screen Shot 2021-04-12 at 10 18 55 AM Screen Shot 2021-04-12 at 10 19 41 AM

고차 함수

  • 하나 이상의 함수를 인자로 취하는 함수
  • 함수를 결과로 반환하는 함수
  • map, filter, reduce

Map

  • 콜렉션 내부의 기존 데이터를 변형 하여 새로운 콜렉션으로 변경 및 생성

for문을 활용한 변경

Screen Shot 2021-04-12 at 10 26 40 AM

map 고차함수 사용

Screen Shot 2021-04-12 at 10 27 32 AM Screen Shot 2021-04-12 at 10 28 14 AM

Filter

  • 컨테이너 내부의 값을 걸러서 추출

for문을 활용한 filter

Screen Shot 2021-04-12 at 10 28 51 AM

filter 고차함수 사용

Screen Shot 2021-04-12 at 10 29 03 AM Screen Shot 2021-04-12 at 10 29 18 AM

Reduce

  • 컨테이너 내부의 콘텐츠를 하나로 통합

for문을 활용한 reduce

Screen Shot 2021-04-12 at 10 31 50 AM

reduce 고차함수 사용

Screen Shot 2021-04-12 at 10 32 05 AM Screen Shot 2021-04-12 at 10 34 32 AM

고차함수 체이닝

Screen Shot 2021-04-12 at 10 52 18 AM

축약:

Screen Shot 2021-04-12 at 10 54 15 AM

Flat Map or CompactMap

  • 평평하게 펼쳐준다
Screen Shot 2021-04-12 at 11 08 13 AM

2차원 배열을 1차원으로 평평하게 펼쳐준다.

다양한 고차함수의 체이닝:

Screen Shot 2021-04-12 at 11 12 17 AM

Q/A

For문과 성능차이?

축약형으로 사용시 compile에서 for문에 비해 조금 느려질 수 있다.

고민한 점 & 해결방법


현재 만국박람회의 메인화면에서 박람회출품목록으로 화면전환을 할 때 빈 목록의 화면으로 전환되는 문제를 격고 있다. 분명히 JSON파일 또한 적절하게 파싱을 viewDidLoad()에서 진행하였고 테이블뷰 컨트롤러, 테이블뷰 셀에 각각 동일한 cell identifier을 설정 해 놓았고 cell에 데이터를 아래와 같이 올바른 방법으로 dequeu를 했다 생각된다.

guard let cell = self.tableView.dequeueReusableCell(withIdentifier: "ItemTableCell", for: indexPath) as? ItemTableViewCell else {
            return UITableViewCell()
        }

문제점1:

아래와 같은 방법으로 세그를 push하는게 문제였다.

@IBAction func didTapItemListButton() {
  navigationController?.pushViewController(ItemTableViewController(), animated: true)
}

해결방법: thanks to @GREEN

세그를 부쉬하기 위해서는 먼저 새로운 뷰 컨트롤러의 인스턴스가 필요하고 더 나아가 어떤 뷰컨트롤러의 인스턴스를 생성해야 할지 XCode는 모르기 때문에 제대로 새로운 창으로 전환이 되지 않았던 것이다.

@IBAction func didTapItemListButton() {
  guard let pushViewController = self.storyboard?.instantiateViewController(withIdentifier: "itemTableViewController") as? ItemTableViewController else {
    return
  }
  self.navigationController?.pushViewController(pushViewController, animated: true)
}

코드로 짤 수 있지만 그냥 마우스로 버튼을 클릭한 뒤 드래그 앤 드랍으로 쉽게 push 세그하는 방법이 있어서 바로 해당 코드를 지우고 더 쉬운 방법을 채택하였습니다 😅

문제점 2:

박람회 출품 목록에 사진과 글이 자꾸 짤린다. 그리고 왜그런지 모르겠지만 자꾸 clipping된다고 노란색 경고 표시가 뜨는 문제 때문에 오랜시간 씨름하였다.

해결방법: thanks to @붱이 @wtfautolayout

Cell 속 이미지에 constraint를 줄 때 이미지 사이즈를 지정해 준 뒤 x축 y축 constraint 뿐 아니라 leading, trailing, top, bottom constraint를 다 짬뽕으로 줘서 나는 문제점을 인지하였고 X축과 Y축 constraint를 해지하여 노란색 경고창 문제를 해결할 수 있었다.

또한 출품작 이미지 사이즈는 동일하게 하고 싶었고 출품작의 상세정보는 문자열의 길이에 따라 cell의 높이를 조절하고 싶었는데 바보같이 이미지의 사이즈를 고정해 놓은 상태로 top 그리고 bottom constraint를 지정해 주니 글 길이에 따라 셀이 커질리가 있나;; 얼른 이미지뷰 top, bottom → content view의 top, bottom constraint를 없애 버렸다.

self.tableView.rowHeight = UITableView.automaticDimension
self.tableView.estimatedRowHeight = 150

위 코드는 cell의 사이즈를 다이나믹하게 설정할 때 cell이 이미 예상하고 있는 높이가 있기에 cell의 작업량을 덜어줘서 효육성을 높혀주기 때문에 사용하면 좋은 코드라 생각되어서 적어본다.

profile
james, the enthusiastic developer

0개의 댓글