11월, 2020의 게시물 표시

[UXKit] 앱 탐구 생활 - 29CM

이미지
[app review] 앱 살펴보기 (1) - 29CM 에디터 추천 이 붙어있는 앱을 한번 살펴볼까 합니다. 29CM이라는 앱이고, 디자인적으로 굉장히 잘 되어있다고 해서 선정하게 되었습니다. 앱 구성 크게 5개의 탭바로 되어있습니다. 깔끔한 아이콘과 복잡하지 않은 탭바 아이콘 설명이 깔끔한 느낌을 줍니다. 가운데는 영상을 위한 페이지이며, 탭바의 색이 반전되어 있습니다. 다른 화면이지만 나머지 화면들과 디자인 적으로 같아보였습니다. 디자인에 무지해서인지, 화면 전반에 존재하는 왼쪽의 여백에 눈이 많이 갔습니다. 어떤 미적 의미가 있는지 아시는 분은 댓글로 알려주세요. 메인의 투명한 네비게이션바와 우측의 하얀색버튼이 눈에 걸리지 않게 색변화 하는 점이 매우 신기 했습니다. 또한 속도에 따른 네비게이션 버튼과 탭바의 등장과 사라짐은 신기한 경험이었습니다. 따라 구성해보고 싶은 부분 화면이 움직이는 속도에 따라 반응하는 컴포넌트 들 텍스트라벨 부터 탭바, 네비게이션까지 사용자가 빠르게 스크롤 할 때와 느리게 할떄가 반응이 달랐습니다. 화면을 아래로 스크롤링 했을 때 탭바가 올라오고, 위로 스크롤링 했을 때 탭바가 내려가는 기능 29TV에 있는 공유하기 버튼 귀욤뽀작하게 SNS버튼으로 구성된 커스텀 공유 버튼을 구현해보고 싶습니다. 이미지 배너를 스크롤링 할 때 자연스럼게 백그라운드 컬러로 fade out 빠른 스크롤링에도 끊김없는 카드로딩과 스크롤링

[swift] swift 기본 문법 스터디 3주차

이미지
[swift] swift 기본 문법 스터디 3주차 이번주는 흐름제어에 대해 정리해 놓으려고 합니다. 가장 정확한 문서는 공식문서라고 생각하고, 링크 를 첨부해 놓겠습니다. 불면증을 위해 한 번 정독했습니다. 반복문 for ~ in 루프상수, 순회대상 루프상수의 생략가능 다중루프 -> 차원을 줄이는 것이 가능? 몇번 돌지 보통은 알지 않을까요? while 조건을 만족하는 동안 실행 한번은 실행을 보장해주는 repeat while 어떻게 만들어 진걸까요? Dictionary Array set 범위데이터 문자열 Sequence Iterator 조건문 if if 키워드 뒤에는 반드시 조건식이 와야합니다. 참 일 경우에는 if 뒤의 구문을 실행합니다. 중첩된 이프문의 조건 정리하는 꿀 팁 아시는 분? guard 조기 종료 참일 때 실행되는 구문이 없다 조건 체크에 사용하면 좋습니다 #available(<플랫폼이름 버전>, <플랫폼이름 버전>, <플랫폼이름 버전>…) switch 일치하는 패턴이 있다면 실행하고 switch문 종료 default 패턴 매칭 제어 전달문 break switch에서 사용, 반복문에서 사용 종료 continue 종료하지 않고 패스! label 신기! fallthrough 다음으로 넘어가지 않음! return 함수와 메소드에서 사용 값을 반환, 종료

[swift] swift 기본 문법 스터디 2주차

이미지
[swift] swift 기본 문법 스터디 2주차 변수와 상수 메모리에 값을 저장하려면 저장하고 싶은 메모리의 주소값이 필요합니다. 그리고 우리가 저장한 값을 가져올 때도 메모리의 주소값이 필요하겠죠? var x: Int = 10 print(x) withUnsafeMutablePointer(to: &x) { print("x address: \($0)") } x = 20 print(x) withUnsafeMutablePointer(to: &x) { print("x address: \($0)") } let y: Int = 30 print(y) withUnsafePointer(to: &y) { // error! print("y address: \($0)") } 위와 같은 방법으로 메모리 주소값을 찍어보았습니다. 생각보다 간단하지 않아 당황했네요. 그런데 아직 의문인것은 같은 변수이지만, let 변수는 mutable 하지 않기 때문에 withUnsafeMutablePointer로 주소를 찍을 수 없었습니다. 이 부분에 대해서는 어떤 의미가 있는지 더 찾아보고 수정하도록 하겠습니다. 또한 변수에는 한글, 알파벳, 아라비아숫자, 특수기호까지 지원하는데 영어와숫자를 사용하는 것 이외에 다른 방법으로 변수를 할당하는 예가 있다면 알려주세요! 자료형 우리가 저장한 변수에는 타입이 있습니다. 기본적으로는 같은 타임의 변수들끼리 연산이 가능하죠. 실제 자료형들은 구조체로 구현되어 있으며, 연산이 가능한 연사자들이 내부에 정의 되어 있습니다. Int - 정수를 저장할 때 씁니다. signed Int8 => 127 ~ -128 : 2^8(256) Int16 => 32767 ~ -32768 : 2^16(65,536) Int32 ^^;; Int64 ^^;; unsigned Int8 => 0 ~

[swift] 옵셔널 체이닝 vs 옵셔널 바인딩

이미지
[swift]옵셔널 체이닝 vs 옵셔널 바인딩 옵셔널 체이닝과 옵셔널 바인딩이 헷갈려 정리해 놓았습니다. 언제 필요할까요? 옵셔널은 프로퍼티에 값이 있을 수도있고, 없을 수도 없음을 나타내는데 사용되었습니다. 옵셔널은 값이 없을 때 nil을 할당 해줍니다. 문제는 우리가 필요한 값이 nil인지 아닌지 확인을 해야하는 번거로움이 있다는 것 입니다. 코드로 예를 들어보겠습니다. class Person { var name: String var job: String? var home: Apartment? init(name: String, home: Apartment?) { self.name = name self.home = home } } class Apartment { var buildingNumber: String var roomNumber: String var security: Person? var owner: Person? init(dong: String, ho: String, security: Person?) { self.buildingNumber = dong self.roomNumber = ho self.security = security } } let chulsoo: Person? = Person(name: "chulsoo", home: apart) let apart: Apartment = Apartment(dong: "101", ho: "202", security: chulsoo) let hyunho: Person? = Person(name: "leeo", home: apart) leeo 라는 사람의 apart 에 있는 security의 이름이 알고 싶습니다.

[iOS] Prefetching으로 프레임드랍 막기

이미지
[iOS] Prefetching으로 프레임드랍 막기 필요한 이유 컬렉션 뷰에서 cellForRowAt 메소드로 데이터를 가져와서 컬렉션 뷰를 그릴 경우, 셀을 구성하는 작업은 메인 쓰레드에서 진행 될 것입니다. 많은 셀을 메인 쓰레드에서 진행한다면, 프레임 드랍이 일어날 수 있고 결과적으로 매끄러운 스크롤링이 불가능합니다. 이런 작업을 돕기 위해 Prefetching이 추가되었습니다. 사용 필요 요건은 다음과 같습니다. iOS 10.0+ Xcode 11.3+ 비교 그럼 그냥 컬렉션 뷰만 쓸 때와는 어떤점이 다를까요? 사실 이미지나, 서버에 요청해서 데이터를 받아오지 않아서인지 큰 차이를 느끼지 못했습니다. 하지만 구현 해놓고 브레이킹 포인트를 걸고, 출력을 해 보면서 차이를 느낄 수 있었습니다. 가장 먼저 제가 다름을 느낀 곳은 같은 화면을 구성하는데 프리패칭 프로토콜을 채택해서 구현 했느냐, 아니냐에 따라 데이터의 fetching 갯수가 다른 것 이었습니다. 왜냐하면 cellForRowAt에서는 셀을 그리기 위한 작업만을 해서 그런지 그리기 위한 데이터만 가져오는 것 처럼 보였습니다. 하지만 프리패칭 프로토콜을 채택하면, 디스플레이 영역이 아닌, 프리패칭의 영역의 데이터를 미리 가져옵니다. 그렇기 때문에 가져오는 데이터의 갯수가 다릅니다. 화면에 6개가 그려져야 할 때, Prefetching 없이 컬렉션 뷰로 그리게 되면 일단 화면에 그려지는 6개의 셀의 데이터만 가져오고 아래로 스크롤 할 때 새로운 데이터를 로드 합니다. 하지만 이 갯수가 중요한게 아닙니다. 이 그림을 그리는 작업이 어디서 이루어지고 있는지가 핵심입니다. 셀을 그리고 있는 cellForRowAt작업은 메인 스레드에서 이루어지는데 해야 할 일들이 많아지면 다 처리하지 못하고 프레임 드랍이 일어날 수 있다. 이 작업 중 일부가 백그라운드에서 일어나게 되면 메인 쓰레드에 걸리는 부하가 줄어들고 프레임 드랍

IOS Developer Roadmap

IOS Developer Roadmap IOS개발로드맵 을 보고 공부 순서대로 진행하면서 느끼는 회고를 정리하려 합니다. 최근 업데이트일 : 2020-11-13 개발자의 기본역량 자료구조와 알고리즘 기본적인 터미널 사용법 깃과 버젼관리 [2020-04-14] git을 사용하는데 필요한 기본 개념과 기본 용어 정리 [2020-09-09] git의 upstream과 origin 헷갈리는 사람 손! [2020-09-09] git의 마지막 커밋 메시지 수정하기 SSH HTTP / HTTPs 그리고 API 정보 검색 [2020-04-11] 구글링 할 때의 팁 문자열과 인코딩 오픈소스 [2020-04-01] 오픈소스 라이선스 정리 [2020-04-11] Github 이슈 라벨(issue labels) [2020-04-21] Opensource에 처음 기여해보고 싶어서 찾은 내용 [2020-05-06] 오픈소스 기행문 - 문서번역 (만화로보는 https 동작원리) [2020-09-29] Kingfisher 둘러보기 [2020-10-27] Hacktober Fest 참가하세요 두 번 하세요! 기초체력 Swift 기본문법 Collections ControlFlow(while, for, iterating collection, nested loop) [2020-09-17] if 문에서 콤마와 && 연산자의 차이점 Optional [2020-03-27] Optional값 다루기 [2020-10-21] Optional 뜯어보기 Optional binding [2020-03-25] guard let, if let 차이 Guard [2020-10-06] guard문으로 함수 입구 틀어막기! Object Oriented Programing [2020-03-27] 함수(fuction)의 기본 개념정리 [2020-03-28] 구조체(struct

[swift] guard let, if let 차이

이미지
[swift] guard let, if let 차이 Optional 변수를 안전사게 사용하기 위해 방법을 찾던 중 if let과 guard let에 대해 정리하겠습니다. 변수에 값이 올지 않올지 확신할 수 없을 때 Optional을 씁니다. 그러면 Optional 타입의 변수에 값은 어떻게 꺼내어 사용할 수 있을까요? 간단합니다 옵셔널 바인딩을 해서 사용합니다. 값이 올지 안올지 정확히 알 수 없을 때 Optional 타입의 변수 를 사용하는데요 잘 모르는 분들이 이 전 글을 참고 해주세요! 안전하게 Optional 타입의 변수를 Unwrap하기 위해서는 옵셔널 바인딩을 해야하는데요 크게 두 두가지 방법이 있습니다. 바로 if let과 gurad let 입니다. 코드로 보는 예제 다음 예제 코드를 통해 둘의 차이점을 살펴 보겠습니다. func fullName(name:String, rawPrefix:String?){ // if let을 사용했을 경우 if let prefix = rawPrefix { print(prefix+name) } else { print("need prefix") } // guard let을 사용했을 경우 guard let prefix = rawPrefix else { print("need prefix") return } print(prefix+name) } fullName(name: "hyunho", rawPrefix: "Lee") 풀네임을 작성할 때 이름은 필수이지만 성은 언제나 들어오지는 않는 옵션널 한 값 입니다. guard let을 사용하는 경우에 이름만 들어오고 성이 들어오지 않았다면, 이런 케이스는 예외 케이스, 혹은 원하지 않는 상황 이라고 판단합니

[iOS] ViewController의 화면전환 방법 정리

이미지
[iOS] 화면전환 방법 어떤 버튼을 눌러 다른 페이지로 이동 시키는 일은 항상 헷갈립니다. 이번 기회에 정리해 두고 가려고 합니다. 일단 버튼을 하나 만들고 눌러서 내가 원하는 페에지와 실제 페이지가 잘 나타나는지 정리하겠습니다. 이런 버튼이 하나 있고 화면을 전환 해 보도록 하겠습니다. 스토리 보드 가장 쉬운 방법이라고 생각합니다. 내가 액션을 줄 컴포넌트를 클릭하고 컨트롤 + 드래그로 원하는 페이지에 드롭합니다. 선이 생기면서 어떻게 보여줄 것인지 segue action을 선택하면 됩니다. 일단은 present modally를 선택합니다. 버튼을 누르면 모달 창이 새로 생기죠? 아주 쉽고 간편하답니다! viewController present @IBAction func buttonClick(_ sender: Any) { let viewControllerName = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewID") if let view = viewControllerName { self.present(view, animated: true, completion: nil) } } 다음과 같은 코드를 작성해줍니다. 스토리 보드에 만들어 준, 뷰컨트롤러의 스토리보드 아이디를 설정 해줍니다. 저는 SecondViewID 로 설정 해주었습니다. 버튼에 IBAction을 설정 해 준다음에 스토리 보드에서 스토리 보드에서 설정했던 ID를 가지고 옵니다. 그리고 가져온 뷰컨트롤러를 self에서 present 해줍니다. viewControllerName?.modalTransitionStyle를 설정하여 모달의 전환을 설정할 수 있습니다. @IBAction func buttonClick(_ sender: Any) { let viewController