[Swift] JSON 객체를 구조체로 변환하기
·
Swift
일반적으로 Swift에서 API를 통한 HTTP통신으로 데이터를 주고받을때 Data 타입의 객체를 사용했는데, 소켓 통신을 하면서 JSON 형식의 객체(JSON Object)를 사용했다. JSON 객체를 바로 사용하기엔 불편함이 많아서 구조체로 바꾸기 위해 사용했던 방법을 기록한다. 이전까지 뜻을 정확히 모른 상태에서 사용하다가 이번 기회에 JSON에 대해 알아봤다. JSON이란? JavaScript Object Notation의 약자로 자바스크립트 언어에서 배열 또는 키-값 쌍으로 이루어진 데이터 객체를 전달하기 위해 사람이 읽을 수 있는 텍스트 형식을 사용하는 포맷이다. 프로그래밍 언어와 플랫폼에 독립적이라는 특징이 있어서 다양한 환경에서 사용되며 Swift에서도 객체를 JSON 형식으로 변환하거나 ..
[Swift] Singleton과 Thread-Safe
·
Swift
여러 개의 뷰 컨트롤러가 유저의 아이디와 닉네임을 사용해야하는 상황이 있었다. 각 뷰 컨트롤러 클래스에 유저의 아이디와 닉네임을 저장하는 프로퍼티를 정의하여 초기화 시 그 값들을 넘겨주는 방식이었는데, 그렇게 하지않고 유저 정보를 저장하는 공유 객체를 만들어서 필요할때마다 참조하면 편할 것 같다는 생각이 들어 싱글톤 디자인 패턴을 적용하려고 했다. 로그인이 완료된 시점에 싱글톤 객체를 생성하고 로그아웃 시 객체 메모리를 해제하는 방법을 찾다가 우연히 Thread-Safe에 대해 공부하게 된 것을 정리한다. 보통 Swift에서 싱글톤 패턴 구현 방법을 찾으면 아래의 방법이 사용된다. class Singleton { static let shared = Singleton() private init(){} } ..
[Swift] 초기화(Initialization)란?
·
Swift
이 글은 스위프트 공식 문서를 한국어로 번역한 Swift Language Guide의 초기화 챕터를 간단하게 정리한 글 입니다. 공식 문서를 번역해주신 분들에게 감사의 말씀을 전합니다. 초기화란? 초기화는 클래스, 구조체, 열거형 타입의 인스턴스를 사용하기 위해 준비하는 단계로서, 타입마다 초기자(initializer)를 정의하여 초기화할 수 있습니다. 초기자는 init 이라는 키워드를 사용하여 정의할 수 있고 이때 여러 파라미터를 갖도록 만들 수 있습니다. 인스턴스를 사용하기 위해서는 내부의 모든 저장 프로퍼티가 초기값을 갖고 있어야 합니다. 따라서 저장 프로퍼티의 선언과 동시에 값을 할당하여 기본값을 설정하거나 그렇게 하지 않고 초기자를 통해 특정 값을 갖도록 할 수도 있습니다. 1. 옵셔널 타입의 ..
[IOS] Socket.IO를 사용한 Node.js 서버 연결 실패 이슈에 대하여
·
IOS
팀 프로젝트를 하면서 Swift 환경에서 소켓을 사용하기 위해 Socket.IO 라이브러리를 사용했다. Socket.IO, 정확히 Socket.IO-Client-Swift는 Swift에서 Socket.IO로 만들어진 서버와 연결하기 위한 도구를 제공한다. 내 Socket.IO 버전은 15.2.0, 서버는 4.4.1 이었는데 서버와 연결을 시도하니 아래와 같은 메시지가 콘솔에 출력됐다. SocketManager: masked and rsv data is not currently supported. code=1002, type=protocolError 처음엔 클라이언트 쪽의 transport(WebSocket, Polling) 또는 ATS 문제인 줄 알았으나 아니었다. 방법을 찾아보다가 결국 로컬로 서버를 ..
[프로그래머스] 단속카메라
·
알고리즘
https://programmers.co.kr/learn/courses/30/lessons/42884 코딩테스트 연습 - 단속카메라 [[-20,-15], [-14,-5], [-18,-13], [-5,-3]] 2 programmers.co.kr 어려워보이지만 조금만 쉽게 생각해보면 간단히 풀리는 문제였다. 문제를 요약하자면 N대의 자동차가 어느 도로 위를 주행한다. 각 차마다 그 도로에 진입하는 지점과 도로에서 나가는 지점이 주어진다. 이 도로에 진입하여 주행하는 차들은 적어도 한 번은 단속카메라를 거쳐야 하는데 단속카메라를 최소한의 개수로 설치하여 모든 차가 단속카메라를 거치게 하고 싶다. 이때 필요한 카메라의 개수를 구하는 문제이다. 상식적으로 생각했을때 도로 위에 자동차가 가장 많는 지점에 카메라를 ..
[프로그래머스] 큰 수 만들기
·
알고리즘
https://programmers.co.kr/learn/courses/30/lessons/42883 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr 문제를 접하고보니 백준에서 똑같은 문제를 풀었던 기억이 났다. 그때는 고민을 하다가 힌트를 보고 풀었었는데, 지금 다시 풀려고 하니 기억이 잘 나지 않았다. 이 문제를 풀면서 복습의 중요성을 깨닫게 됐다. 자리 수가 최대 100만인 어떤 수가 주어지고, 그 수에서 k개 만큼의 숫자를 빼서 얻을 수 있는 가장 큰 수를 구하는 문제이다. 단순하게 생각했을때 주어진 수 number에서 k개 만큼 뺐을때 얻는 수의 자리 수는 len(number)-k이다. 가장 왼쪽 자리의 수(값이 큰 자리 수)부터 만든다고 가정할때 number안에 존재하는 가장..
[IOS] 스크롤 중 Timer가 동작하지 않았던 이슈와 해결방법
·
IOS
이 글을 이해하기 위해서는 먼저 Timer와 RunLoop에 대한 이해가 필요하다. Timer와 RunLoop에 대하여 간략하게 정리한 글 https://lietenant-k.tistory.com/29?category=999190) 팀 프로젝트를 진행하다가 Timer를 활용하여 카운트다운 기능을 구현하려고 했다. countDown 메서드 내부에서 Main RunLoop에 Timer를 추가하고 1초 간격으로 타이머를 발동시켜서 해당 코드 블럭을 호출하게 했다. var time = 10 let label = UILabel() func countDown(){ let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [unowned self]..
백준 22942번 : 데이터 체커
·
알고리즘
https://www.acmicpc.net/problem/22942 22942번: 데이터 체커 데이터가 조건에 맞는다면 YES, 조건에 만족하지 않는다면 NO를 출력한다. www.acmicpc.net 스택 자료구조를 활용해서 푸는 문제이다. x좌표상에 N개의 원이 존재하고, 각 원의 중심(x좌표)와 반지름이 주어진다. 이 N개의 원들 중에서 임의의 원 2개를 선택했을때 교점이 존재하는지 판단하는 문제이다. 즉, N개의 원 중 어느 것이라도 다른 원과 교점이 있으면 안된다. 데이터의 개수(N)이 최대 200,000이므로 N개 중에 2개를 선택하는 모든 경우의 수를 구하는 방법은 시간 초과 판정을 받기 때문에 다른 방법으로 문제를 해결해야 한다. A (중심: a, 반지름: r1), B (중심: b, 반지름:..
백준 2473번 : 세 용액
·
알고리즘
https://www.acmicpc.net/problem/2473 2473번: 세 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 www.acmicpc.net 전형적인 투 포인터 알고리즘 문제를 조금 복잡하게 꼬아낸 문제이다. 서로 다른 값을 가진 N개 (3 0: e -= 1 elif v == 0: print(d[i], d[s], d[e]) exit() else: s += 1 print(*r, sep=' ')
백준 20440번 : 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1
·
알고리즘
https://www.acmicpc.net/problem/20440 20440번: 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1 첫째 줄에 지동이의 방에 출입한 모기의 마릿수 N(1 ≤ N ≤ 1,000,000)가 주어진다. 다음 N개의 줄에 모기의 입장 시각 TE과 퇴장 시각 TX이 주어진다. (0 ≤ TE m: m = cnt tem = i flag = True elif cnt < m and cnt - d[i] == m and flag: txm = i flag = False print(m) print(tem, txm)