https://github.com/presto95/Study
연산자 사용자 정의 연산자 토큰으로 사용되는 =, ->, //, /*, */ 등과 전위 연산자 , !, ? 등은 Swift에서 예약한 상태이므로 재정의할 수 없으며 사용자 정의 연산자로 사용될 수 앖다. 전위 연산자 정의와 구현 prefix operator ** prefix func **(value: Int) -> Int { return value * value } 후위 연산자 정의와 구현 postfix operator ** postfix func **(value: Int) -> Int { return value * value } 중위 연산자 정의와 구현 중위 연산자는 우선순위 그룹precedenceGroup을 명시해줄 수 있음 precedenceGroup 우선순위_그룹_이름 { higherThan: 더..
Swift API Design Guidelines 기초 사용 시점에서의 명백함은 가장 중요한 목표입니다. 메소드나 프로퍼티 같은 엔티티는 오직 한 번만 선언되지만 반복적으로 사용됩니다. 이것들을 분명하고 간결하게 사용할 수 있도록 API를 디자인하십시오. 디자인을 평가할 때, 선언을 읽는 것은 충분하지 않습니다. 그것이 문맥 안에서 분명한지 확실히 하기 위해 항상 실제 사용 경우를 시험하십시오. 뚜렷함은 간결함보다 훨씬 더 중요합니다. 스위프트 코드가 간결해질 수 있더라도, 가장 적은 문자들로 가장 작은 실행 가능한 코드를 작성할 수 있는 것은 우리의 목표가 아닙니다. 스위프트 코드에서의 간결함은 강타입 시스템에서의 부작용이며, 자연스럽게 상용문을 줄이는 기능입니다. 모든 선언에 문서 주석을 작성하십시오..
RespectU Memory Profiling 시작 Memory Management in Swift: Understanding Strong, Weak and Unowned References 글을 읽으면서 ARC에 대한 개념을 다시 한번 살피고 있었는데, 글 말미에 메모리 누수 추적에 관한 문장이 짤막하게 나왔다. For example, if you want to detect memory leaks, you can go up to the menu and select Product > Profile > Leaks. 내 앱이 여기에 자유로운지 확인해보고 싶어졌다. 프로파일링 과정 앱 실행 과정은 다음과 같다. 앱 실행 닉네임과 버전을 받아오는 네트워킹을 수행한다. 가이드 부분으로 넘어가기 내비게이션 컨트롤러..
Bezier Path 시작 애플리케이션을 개발하는 과정은 UI를 만드는 것과 스크린에 보여지는 그것의 간단하거나 복잡한 뷰를 만드는 것들을 포함합니다. 애플리케이션의 간단한 '스크린'을 그리는 데에는 다른 방법들과 다른 접근법들이 있습니다: 디자이너에 의해 이미 만들어진 그래픽을 사용, 코드로 UI를 구현, 인터페이스 빌더 사용, 이것들을 조합하여 사용하기, 등등. 그러나, 당신은 프로그래밍적으로 사용자 정의 형태를 만들 필요가 있을 때가 항상 있을 것이고, 어떻게 하는지 모른다면, 그 때에 문제가 되기 시작합니다. 하지만 이러한 문제들은 문서에 따르면 벡터 기반 경로를 만드는 데 필요한 UIBezierPath 클래스를 사용하여 해결할 수 있습니다. 간단하게 말해서, 이 클래스를 사용하여 어떠한 형태를 ..
시작 야곰의 Swift 4 책의 키패스 부분을 보다가 짜증나서 그냥 넘겼던 기억이 있는데, 이제는 이해할 수 있고, KVO에 대해서도 말만 들어봤지 공부는 안해봤는데 슬슬 해야겠다는 생각이 들었다. 사실 RespectU 서버와 그에 따른 클라이언트 코드 수정에 생각보다 너무 많이 애를 먹어서 살짝 추진력이 떨어졌는데, 갑자기 KVO가 생각나서 공부한 것을 정리해둔다. KeyPath 먼저 키패스에 대해서 알아보고 가자. 키패스는 어떤 객체의 프로퍼티 혹은 프로퍼티의 프로퍼티 체인에 대해서 그 이름을 통해서 값을 찾아나가는 표현을 말한다. 기본적으로 Objective-C 쪽에서 사용해온 기능인 것 같고, Swift 초기에는 이것에 대한 기능이 별도로 마련되지 않았다고 한다. 문자열을 사용하여 NSObject..
HTTP 상태(응답) 코드 참고 링크 (zerocho.com) 1xx 정보와 관련됨 100 서버가 요청의 일부를 받았고, 나머지 요청을 기다리고 있는 중 101 프로토콜 전환이 일어날 때 전환이 승인됨 2xx 성공과 관련됨 200: OK 일반적인 성공 201: Created 새로운 컨텐츠 만들기를 성공 (새로운 글, 댓글 등) POST 메소드에 대한 응답으로 잘 어울림 204 요청에 성공했으나 응답할 컨텐츠가 없음 206 요청에 대한 응답으로 일부만 먼저 전송함 3xx 리다이렉션과 관련됨 301: Moved Permanently 주소가 영구적으로 바뀌어 상태 코드와 함께 새로운 주소로 이동시킴 새로운 주소는 캐싱되므로 속도가 빨라짐 302: Found 대부분의 리다이렉트에 사용되는 상태 코드 임시적인 주..
데이터넣는중 기존에는 Realm 에 저장하기 위해 네이티브 코드를 박아두었다. 무식한 방법이지만 당시에는 어쩔 수 없었고 지금도 달리 방법이 생각나지 않는다. 네이티브 코드로만 2000줄이 약간 안된다. 링크 이 모든 데이터를 MongoDB 에 박아넣고 있다. 이 작업과 간단한 라우팅, 그리고 기존에 말도 안되는 데이터베이스를 정규화하는 과정이 일주일 정도 걸리고 있다. 그래도 애초에 이렇게 했어야 했는데... 어쩔 수 없지. 클라이언트에서 서버에서 받아온 데이터를 어떻게 사용할까 고민하고 있는데, 다음과 같다. 매번 서버로부터 요청하여 뿌려준다. 서버와 클라이언트 데이터를 동기화한다. (서버 버전 변경 시 동기화한다.) 1번처럼 하면 클라이언트 단에서도 많이 바꾸지 않고 쉽게 가능하겠지만 사실 말이 안..
UITableViewCell 의 재사용 prepareForReuse() 테이블 뷰의 델리게이트에 의해 재사용을 위한 재사용 가능한 셀을 준비한다 UITableViewCell 객체가 재사용 가능하면, 즉, reuse identifier 를 가지고 있다면, 이 메소드는 UITableView 의 dequeueReusableCell(withIdentifier:) 메소드로부터 객체가 반환되기 직전에 호출된다. 퍼포먼스적 이유로, 알파값, 편집, 선택 상태와 같은 컨텐츠와 관련된 것이 아닌 셀의 속성을 리셋해야만 한다. tableView(_:cellForRowAt:) 의 테이블 뷰 델리게이트는 항상 셀을 재사용할 때 모든 컨텐츠를 리셋한다. 셀 객체가 관련된 reuse identifier 를 가지고 있지 않다면, ..
2017년 10월 초 iOS에 먼저 배포되고, 그 달 말 Android에도 배포된 국산 리듬게임 DJMAX RESPECT의 가이드 애플리케이션 RespectU. 당시엔 개발을 시작한 지 진짜 얼마 안 되었고, 당연히 백엔드는 아예 할 줄 몰라서 어찌어찌 Realm 을 사용해서 로컬에 데이터베이스를 싹다 몰아넣고, 올해 초에 스킬 포인트 / 랭킹 시스템을 도입하기 위해 Firebase 를 붙여서 서버의 역할을 흉내내게 하기는 했었다. 이렇게 그냥 둬도 되긴 한데, 백엔드를 안하고 개발자 바닥에 뛰어들 순 없으니까... Node.js를 공부하면서 리스펙트유 프로젝트에 직접 만든 서버를 붙이는 프로젝트를 진행하기로 했다. 목표는 다음과 같다. Firebase 를 통해 하고 있던 기능들 서버로 옮기기 인증 데이..