Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

iOS 개발일지

0802 새싹 23회차 정리 - First Class Object 본문

SeSAC iOS 데뷔과정 2기

0802 새싹 23회차 정리 - First Class Object

Lia's iOS 2022. 8. 3. 23:10
iOS 앱 개발자 데뷔 과정 23회차

 

 

 

 

#1. Checklist

- .gitignore

[0802 새싹 22회차 정리] #0. Memo 참고

 

 

 

- Pagination

Pagination이란 보여줄 데이터는 많으나 한번에 다 보여줄 수 없을 때, 쿼리의 결과값으로 리턴된 리소스를 분할하여 전달하는 것이다.

Offset based Pagination은 몇 번째 페이지에서 몇 개의 데이터를 보여줄 지 쿼리스트링으로 전달한다.

페이지 단위로 서버에게 정보를 요청하는 사이에, 서버의 데이터가 변화한다면 중복 데이터가 노출될 수 있다.

서버의 데이터 변화가 적은 구조의 경우(일반 검색 결과 등)에 적합하다.

 

Cursor based Pagination은 클라이언트가 가지고 있는 마지막 데이터를 기준으로, 다음 데이터를 조회하는 방식이다.

사용자가 조회한 시점 이후에 최신 데이터가 서버에 추가된 경우, 최신 데이터에 대해서 페이지네이션으로 조회가 힘들 수 있다.

현재 페이지 기준으로 전,후의 데이터를 호출하는 방식이기 때문에 정보를 건너띄고 중간 페이지에 대한 값을 얻기 힘들다.

정보의 휘발성이 높고 데이터 변화가 많은 경우(트위터 등)에 적함하다.

 

 

 

- urlQueryAllowed

네이버 API를 활용해 검색 결과로 이미지를 받아오는 함수를 만드는데, query에 한글을 전달하면 오류가 발생한다.

영어로 하면 결과가 잘 나오는데 왜 한글만 오류가 발생하는지, Naver Developers를 참고하면 아래와 같다.

query가 요청하는 타입은 문자열이며, UTF-8로 인코딩 되어있어야 한다.

따라서 검색하고싶은 문자열을 인코딩 시키면 되는데, url의 경우에는 urlQueryAllowed를 주로 사용한다.

그리고 변환한 문자열을 url의 query로 넘겨주면 제대로 검색 결과가 나온다.

참고로 Insomnia는 자동으로 변환해주기 때문에 해당 오류가 발생하지 않는다. 

 

 

 

- First Class Object

일급 객체란 다른 객체들에게 적용 가능한 연산을 모두 지원하는 객체를 뜻한다.

TMI : 이는 1급시민을 뜻하는 First Class Citizen에서 기원한 단어이다. (2급 이하는 온데간데 없다)

일급 객체의 특성은 아래와 같이 세 가지가 있으며, Swift의 함수는 일급 객체 특성을 만족한다.

 

1. 변수/상수 또는 데이터 구조 안에 함수를 저장할 수 있다.

함수의 결과값을 상수에 할당하는 대입 연산자의 관점이 아닌, 함수 자체를 대입할 수 있어야 한다.

함수 자체를 대입할 수 있다면 변수/상수에 함수를 저장할 수 있고, 매개변수 또는 반환값에 함수를 전달할 수 있다.

 

Function Types

함수 자체를 대입하여 매개변수, 반환값, 변수/상수에 함수를 사용할 수 있게 된다는 것은 함수 호출 형식이 확장된다는 것을 의미한다.

따라서 함수 호출 연산자 () 없이 함수를 호출할 수 있으므로, 함수 이름 다음에 함수 호출 연산자를 쓸 필요가 없다.

함수의 오버로딩 특성으로 함수를 구별하기가 어려워진다면, 타입 어테이션과 함수의 식별자 사용을 통해 구별할 수 있다.

 

2. 함수의 반환값으로 객체를 사용할 수 있다.

반환값이 없는 경우에는 () -> Void, () -> () 로 타입이 이루어진다.

Void는 타입알리어스 별칭이다.

함수의 반환값에서 객체를 사용할 때, 가장 왼쪽에 위치한 -> 를 기준으로 인자값과 함수의 반환값을 구별한다.

 

3. 함수의 인자값으로 객체를 전달할 수 있다.

함수 타입을 매개변수의 타입으로 사용한다.

어떤 함수가 인자값으로 들어가는지와 상관 없이 단지 함수의 타입만 잘 맞으면 되기 때문에, 실질적인 연산은 인자값으로 받는 함수에 달려 있어서 중개 역할을 하는 함수를 브로커 함수라고도 한다.

항상 함수를 만들어서 인자값에 넣을 수는 없기 때문에, 클로저(익명 함수)로 사용을 하기도 한다.

 

Parameters vs Argument Label

Parameter (매개변수) 는 함수의 정의에 포함되는 변수를 의미한다.

Argument (전달인자) 는 함수를 호출할 때 전달하는 실제 값을 의미한다.

아래와 같은 함수가 있다고 가정했을 때

func someFuction(argumentLabel parameterName : Int) {     }

함수를 호출했을 때 붙는 이름이 ArgumentLable, 값을 전달받은 함수 내부에서 사용할 목적의 이름이 ParameterName이 된다.

 

 

 

- Typealias

Typealias란 해 타입에 붙일 수 있는 별칭, 약칭이다.

Typealias (사용할 별명) = (존재하는 타입) 과 같은 형태로 Alias(별칭)을 지정할 수 있다.

Typealias를 사용해서 의미를 부여해주면 문맥에 대한 명확성을 부여할 수 있고, 코드가 간결해져 가독성이 좋아진다.

만약 매개변수로 여러개의 클로저를 사용한다면 한 눈에 보기 어려울 수 있기 때문에, Typealias를 유용하게 사용할 수 있다.

 

 

 

 

#2. Assignment

- ImageSearchViewController 구현하기

수업에서 진행한 ImageSearchViewController에 컬렉션뷰를 활용해서 셀에 응답값(Image) 보여주기

결과물

 

 

 

- TMDB API 구현하기

참고 자료(좌), 중간 결과물(우)

내일 해야할 것

1. 장르 레이블 자리에 뭐라도 넣기

2. 이미지뷰에 이미지 제대로 넣기

3. shadow 넣기 (xib에서 uiview 어떻게 뒤로 보내는지 생각해보기)

 

 

레이아웃을 나름 깔끔하게 잡았다고 생각했는데, 실행하니 이해하기 힘든 배치가 나왔다.

Storyboard에서 설정한 AutoLayout(좌), 실제 시뮬레이터 화면(우)

이렇게 된 원인의 대부분은 UILabel에 있었다.

Label들의 크기를 따로 지정하지 않았기 때문에 Text의 크기에 따라 객체의 크기가 결정되는데, 빈 정보를 전달하니 사라진 것이다.

코드에서도 아예 아무 정보를 전달하지 않았다면 저 화면을 보고 당황하지는 않았을텐데... 하는 생각이 들었다.

해결 방법은, 그냥 비어있지 않게 문자열을 넣어주면 된다.

해당 화면에서 보이는 객체는 버튼이거나, 코드로 빈 정보를 전달하지 않았거나, Double Type을 전달해서 0.0으로 뜨는 것이다.

 

 

 

 

# 그 외

공공데이터포털 : https://www.data.go.kr

정부에서 제공하는 데이터 (xml 제공하는 경우가 많다)

 

 

 

 

- Simulator Condition : 시뮬레이터 네트워크 환경 느리게 설정하기