어제 못다 들은 네트워크 부분, 데이터를 받아와서 처리하는 부분을 배워보았다.
예전에는 (swift 4버전 이하) JSONSerialization 를 통해 데이터를 처리했다고 하는데, 모양이 매우 복잡해보여서 Swift 5d에게 여러모로 감사하고 있다(애매한 문법들도 Swift 5에서 일부 사라진것도 있고, 필요한 건 생긴것도 있어서 감사하다고 생각중이었는데...오늘 data fetching부분을 보니 더 강하게 생각이 들었다)
js 를 하면서 api로 fetching하는게 처음에는 낯설었고 지금은 잘은 모르는데 얼레벌레 하는 수준이 되었는데, 그런 얼레벌레 하는 수준이라도 스위프트에서의 fetching 이해에 조금은 도움이 되는 것 같아 감사할 따름인 챕터였다.
물론 문법은 다르지만 전반적인 흐름, 그리고 데이터를 재련?하는 과정은 비슷한 구석이 많이 있기때문에 이해하는데 도움이 되었다.
Swift 5부터는 JSONDecoder 객체의 decode 메서드를 활용해서 데이터를 fetching 할수있게 되었다고한다.
단순 암기를 제발 지양해달라고 하시면서 활용을 통해 계속 반복사용하면서 암기가 되는거라고 하셨는데, 이부분에 동감하면서도 반대로 나는 이번에 배우면서 내가 얼마나 기초 문법없이 공부했는가..를 반성하게되었다.
js때 정말 멋도 모르고 따라치는 부분들이 분명히(지금도 99%의 나의 코드는 그럴것이다) 많았기에 이번 Swift 에서 문법을 배우고 => fetching 예시를 보는 과정에서 깨닫는 부분이 많았다.
확실히 기초문법을 알아야 왜 데이터를 이렇게 바꿀수 있는지 심지어는 이게 파라미터인지, 클로저인지, 그래서 이름을 변경할수있는것인지... 까지 알게 되고, 그래야 활용하기도 더 쉽다(안그러면 조금만 달라져도 활용하는데 어려움을 많이 느끼니까)
앞부분에서 배운 구조체, Class, 클로저, 프로토콜, 메서드, do try catch 에러처리 구문, 옵셔널, 옵셔널 바인딩, @escaping 어트리뷰트 키워드, 심지어는 함수의 기본적인 파라미터와 아규먼트 개념까지 숙지가 되어있어야 코드를 복붙해서 쓰더라도 제대로 쓸수있는 것이다.
너무 당연하지만 쉽게 놓쳤던 부분인것같아 (사실 js와 react를 배울때는 한번 경험해본다는 느낌으로 접근했기 때문에 마음가짐과 시간투자가 달랐던 것도 있지만) 반성하고,
또 지금 이렇게 쓰는 중에도 swift 문법을 내가 완벽하게 흡수하지 못했음을 뼈저리게 느끼면서 반복을 해야겠다는 다짐이든다. 대신 너무 조급하지 않게! 너무 지치지 않게 하는게 나의 목표다.
갑자기 공부내용을 읊다가 출사표가 되었는데 다시 돌아오자면
URL로 데이터를 주고받기 위해서 Swift 에서는 크게 다음과 같은 네가지 단계를 따른다
1. url(문자열)
2. url 구조체
3. urlSession
4. 세션에 작업부여 (이때 fetching은 일시정지상태다)
=> 에러처리, Class나 Struct등 내가 원하는 모양으로 데이터 다듬기
5. resume() 으로 작업 시작
이때 주의점이 여러가지가 있는데
1. decode 가 throws 키워드로 정의되는 에러를 뱉는 메서드임을 알기 => try 반드시사용
2. 내가 정리하려는 구조체/Class에 반드시 Decodable(혹은 Codable)프로토콜 채택하기
3. 타입명.self 에서 self 를 점 접근연산자로 붙이면 인스턴스가 아닌 틀 자체를 의미함을 알기
4. return 값이 옵셔널인 것에 주의하여 if let 바인딩등으로 unwrapping 필요함을 알기
5. 비동기적 작업으로 @escaping 콜백함수(클로저) 등 @escaping 키워드를 파악하기
6. 클로저에서 객체의 속성, 메소드에 접근하기 위해 반드시 self를 붙여야함(혹은 캡처리스트에 [self] 도 가능은 할 것이다..)을 알기
등등 이다.
구구절절하게 적어보았는데 단순히 초보자인 나의 기준일 뿐이고 뭐니 뭐니해도 실습을 통한 체화가 가장 중요하다는것 + 이해하고 사용해야한다는 것 을 배웠다.
가장 기대하던 동기화 파트는 도입부만 우선 본 후에 어제 미쳐못한 복습을 먼저 꼭 해야할것같아서 조금 뒤로 미루게 되었다.
얼마 듣지 않았는데 좀 힘든 ^^ 오늘 강의
음료수 마시면서 휴식합니다..
스터디 있는 날이기 때문에 운동시간 + 발표준비 시간 확보로 우선 1차 복습만 마쳐보았다.
옵셔널타입 그리고 옵셔널 타입 추출방법 4 가지, 옵셔널 체이닝 가볍게(뒤에서 더 다룸) IuO 라고 불리는 암시적 추출 옵셔널 타입, 함수에서의 옵셔널타입 파라미터 및 nil기본값 셋팅 등 을 복습했다.
옵셔널 타입은 일종의 임시적 타입이라고 볼수있는데 기본타입 + nil 이라고 볼 수 있다. 다만 한꺼풀 더 덮어진wrapping 된 형태이기 때문에 ( 실제로는 enum인 열거형 타입으로 한꺼풀 덮어진것이다) unwrapping 해서 사용해야한다.
unwrapping 방법
1. 강제추출 (강제추출연산자 ! 사용)
=> 에러발생가능성 (nil에 사용시)
2. if문으로 nil 확인 후 강제추출
3. if let 혹은 if var, guard let , guard var 바인딩으로 우아하게 풀어내는 옵셔널바인딩 (강추)
4. nil-coalescing (기본값셋팅하고 싶을때)
=> 옵셔널타입 ?? 기본값
3번을 가장 많이쓰고(뒤에서도 보면) 그리고 가끔 4번을 쓰고, 아주 간단히 하고싶을때 아주 가끔 아주 확실할때 1,2번을 쓰는 느낌인듯
개인적으로도 3번이 가장 편하기도 편하고 직관적이고 논리적인 느낌이다 ( 위험하지도 않음! )
옵셔널 체이닝은 옵셔널 타입에 접근시 ? 를 붙여줘야 하는 것인데...js에서도 비슷한 문법이 있어서 낯설진 않았다(다만 조금 더 깊게들어가면 다를지도)
IUO타입은 ! 를 붙여주는것, 뒤에서 더 자세히 배울 내용이다.
함수에서 파라미터를 옵셔널로 명시하고, nil을 기본값으로 넣어주는 애플기본 함수(애플에서 미리 만들어놓은 메서드들) 이 많은데, 이경우 함수를 호출할때 해당 파라미터에 해당하는 argument를 생략할 수 있기때문에 유동적 사용이 가능하다 (굿)
그리고..대망의 컬렉션
배열, 딕셔너리, 세트 순으로 배우게되는데
배열먼저 마무리하였다.
순서있는 타입이고 뒤에 URLSession을 활용한 api 데이터 패치를 확인하니 return 타입이 옵셔널 Array인 경우가 많아서 이래서 제대로 알아야하는구만 싶었다.
index와 관련된 메서드가 많은데 특이한것은 endIndex 로는 마지막 요소에 접근할 수 없다는 것이다. endIndex -1로 접근해야한다 (메모리관점에서의 endIndex이기 때문임)
이와 반대로 lastIndex(of:)를 통해 index를 추출하면 그 자체로 요소에 접근 할수있는 index를 반환받을 수 있다. (개념이 조금 다르다)
참고로 배열은 빈배열 nil값이 가능하므로 index를 찾는 메서드들의 경우 전부 리턴값을 optional 타입으로 반환하곤 한다.
따라서 다시 이걸 쓰고싶다면 if let 바인딩등으로 옵셔널을 unwrapping 해주는 과정이 필요하다.
배열은 순서가 있고, 데이터 묶음이기때문에 (딕셔너리, 세트와 다르다)
데이터 묶음에서 볼수있는 append, insert, replace, remove 는 기본이고 순서에 따른 reverse, sort, shuffle 과 같은 메서드도 가능하다.
다만 주의점이 있는데, reverse() 와 reversed()처럼 -ed형이나 -ing 형을 가진 메서드들은 리턴만 할 뿐 실제 배열등에는 영향을 끼치지 않는 메서드라는 것을 주의해야한다.
이때 리턴형은 index를 찾는 메서드들과 다르게 옵셔널 타입은 아니다. 그러므로 nil에 (빈배열에) 해당 메서드들을 적용하지 않도록 주의하자..
reverse()나 sort() shuffle() 의 경우 리턴은 하지않지만 원 배열자체를 바꿔버리는 메서드다.(-ed나 -ing가 붙지않은 동사원형 메서드)
enumerate의 경우 열거하다 라는 뜻 답게 index와 요소를 named Tuple 형태로 묶어서 나열해준다.
named Tuple 형태로 반환하기 때문에 for문에서는 for (index, word) in stringArray.enumerated()처럼 바인딩을 통해 namedTuple의 name들을 바꿔줄 수 있다 : )
~하고나서 정리예정~
우선 오늘은 각자 개인 파트를 읽고 요약하는 식으로 진행했다.
서로에 대해 알아가는 시간을 가지게 되어 좋았다 :)
비록 첫 모임이라 아직.. 예상시간보다 조금 더 걸리고(한시간~한시간 반 예상했는데 2시간 오버됨...^_ㅠ) 스터디의 효용성에 대해 고민했다.
사실 지속가능한 스터디 + 도움이 되는 스터디를 위해서 방식을 바꿔보는걸 고민하고 있었기에 오늘 스터디가 끝날즈음 새로운 방향을 제안해보았다.
내가 제안 드린방향은 3가지 정도였는데
1. 인당 시간을 지정해서 여태 하던 방식을 디벨롭하거나
2. FAQ 자주나오는 질문을 각자 파트별로 맡아서 하거나
3. 연습문제를 파트별로 맡아서풀거나
였는데, 2번~3번중으로 좁혀졌다. 조원분들도 같이 고민하고 이야기해주시고 적극적으로 참여해주셔서 감사했다. 여러가지 상황, 그리고 요소들을 고려해보다가 일단 다음에는 FAQ에 있는 어려운 내용 위주로 설명해보기로 했고,
다다음주에는 연습문제 위주로 진행하는 등 다양한 방식으로 진행해보기로 했다.
내가 3번에 대해 고민이 되는 부분을 좀 나열했기 때문에 의견이 이렇게 좁혀진것같기도 한데..혹시 별로면 바로 다른 방법을 찾아보고, 그전에라도 다른 좋은 방법이 있다면 그렇게 진행해보기로 했다.
스터디 효율 및 의미를 높이기 위해 노력할 예정 :)
확실히 아는걸 한번 더 말로 설명하는건 생각보다 어렵고, 또 정확히 알고있어야 하는 것 같다.
회사에서도 느꼈지만 다시한번 느끼게 된 진리..