Apr 12, 2021, TIL (Today I Learned) - Closure, 고차함수
학습내용
Closure
- 코드의 블럭
- 일급객체
- 전달인자, 변수, 상수 등으로 저장, 전달이 가능
- 함수: 이름이 있는 클로저
- 매개변수, 반환 타입 생략 가능
- return 키워드 생략 가능
- 축약된 전달인자 이름을 사용 가능
- 후행 클로저
Closure 기본 형태
{ (매개변수들) -> 반환 타입 in
실행코드
}
고차 함수
- 하나 이상의 함수를 인자로 취하는 함수
- 함수를 결과로 반환하는 함수
- map, filter, reduce
Map
- 콜렉션 내부의 기존 데이터를 변형 하여 새로운 콜렉션으로 변경 및 생성
- 전달인자, 변수, 상수 등으로 저장, 전달이 가능
{ (매개변수들) -> 반환 타입 in
실행코드
}
for문을 활용한 변경
map 고차함수 사용
Filter
- 컨테이너 내부의 값을 걸러서 추출
for문을 활용한 filter
filter 고차함수 사용
Reduce
- 컨테이너 내부의 콘텐츠를 하나로 통합
for문을 활용한 reduce
reduce 고차함수 사용
고차함수 체이닝
축약:
Flat Map or CompactMap
- 평평하게 펼쳐준다
2차원 배열을 1차원으로 평평하게 펼쳐준다.
다양한 고차함수의 체이닝:
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의 작업량을 덜어줘서 효육성을 높혀주기 때문에 사용하면 좋은 코드라 생각되어서 적어본다.
Author And Source
이 문제에 관하여(Apr 12, 2021, TIL (Today I Learned) - Closure, 고차함수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@inwoodev/Apr-12-2021-TIL-Today-I-Learned-Closure-고차함수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)