본문 바로가기

728x90

분류 전체보기

(104)
개행(\n) 없이 두 줄 이상의 문자열 할당하기 보통 문자열을 표현 할 때, 앞뒤로 " (큰따옴표)를 붙여서 문자열을 만든다. 이때 개행을 하려하면 문자열 중간중간에 \n(newLine)을 삽입해줘야 하는데 , \n삽입 없이 큰따옴표 세개를 앞뒤에 붙이면 따로 개행문자를 넣지 않고도 똑같은 표현이 가능하다. 들여쓰기는 마지막 큰따옴표에서 왼쪽 정렬기준으로 보면되는데 아래 그림을 보면 이해하기 쉽다. 아래 그림은 print를 통해 문자열을 콘솔로 나타냈다.
Swift Package 써보기 (feat * XCode13) 이전까지는 SwiftPackage에 대해 잘 모르고 있었는데 , 이번 WWDC2021에서 SwiftPackage 를 소개 하길래 제대로 알게됐다. 보니까 Cocoapods의 Library의존성관리 역할을 xcode에서 지원하는 역할로 보인다. ㅇㅇ 맞다. 난 xcode13beta버전을 받아서 확인해봤다. 지금까지 릴리즈된 xcode에는 지금과 같은 GUI가 아닐수 있으니 참고. 일단 하나의 Library를 새 프로젝트에 추가해보겠다. 추가할 라이브러리는 Alamofire 시작해보자. 아래 세가지 경로로 Package 검색창을 띄울 수 있다. 1. File-> Add Packages 2. TARGETS-> Frameworks, Libraries, and Embedded Content 3. swift파일에서..
DerivedData 삭제 Xcode를 사용하다보면 가끔 프로젝트의 캐시된 데이터가 문제를 발생시킬 때도 있다. 정확히는 그 문제가 뭐였는지 기억은 잘 안나지만 해당 문제를 해결하기 위해 DerviedData를 삭제해보라는 조언들을 찾아볼 수 있었다. 뭐만하면 다 지우라한다... 실제로 DerivedData폴더를 삭제하고 문제가 해결된것을 겪은적이 있었는데, DerivedData는 Xcode를 사용하면서 발생하는 부산물이라 해야할까, 각종 프로젝트를 진행하며 저장된 파일들이 넘쳐난다. 맥 용량관리 차원에서도 DerivedData폴더를 삭제해주기도 한다. DerivedData의 하위 폴더들은 프로젝트를 build하면 다시 생겨나므로 삭제해도 큰 문제가 없다. 어떤 블로그의 경험담을 보면 DerivedData폴더의 하위 폴더들을 삭제..
PhaseScriptExecution failed with a nonzero exit code Release 를 위해 Archive를 시도 하는 중 에러 발생 에러문구 “PhaseScriptExecution failed with a nonzero exit code” 위 문구와 함께 수십줄의 로그가 함께 나타나는데, 보기도 힘든 파일의 경로 로그들과 어쩌구 저쩌구 pod으로 추가한 lib들을 거론한다. 당황하여 내가 pod으로 추가한 lib들이 문제인가 싶지만 의외로 해결법은 간단했다. Solution 로그에서 .sh파일의 이름과 경로를 찾는다. Terminal을 실행해서 해당 파일의 경로로 이동하고 chmod +x 파일의 이름.sh 입력해준다. 그러고 다시 시도하면 잘 작동한다. PS1 더 검색을 해봤는데 Build Phases의 For install builds only에 체크를 해두면 해결이 ..
String Extension 문자열 자르기1 extension String { func substring(from: Int, to: Int) -> String { guard count > from, from >= 0, to >= from else { return "" } let startIndex = index(self.startIndex, offsetBy: from) let endIndex = index(self.startIndex, offsetBy: to + 1) return String(self[startIndex.. Character { return self[self.index(self.startIndex, offsetBy: index)] } subscript(_ range: Range) -> String { let from..
[자료구조] 스택 바로 이전에 공부한 Queue가 FIFO(First In First Out)의 선입선출 방식이라면, 스택은 LIFO(Last In First Out)의 후입선출 방식이다. 스택을 떠올리면 무언가를 쌓는 이미지를 보통 연상하게 되는데 , 요소를 순서대로 밀어넣고(Push) 빼는(Pop) 동작을 수행할 수 있다. Push Push는 아래 그림과 같이 하나 하나 요소를 밀어넣는다. 1 뒤에 2를 push한 후 다음 push연산이 발생하는 위치는 2의 뒤가 되겠다. 이렇게 항상 마지막 요소에서 연산이 일어나는것이 Stack의 특징이다. Pop 그림으로 본다면 간단하지 그지없다. 위에서 Push가 하나하나 요소를 밀어넣었다면 이번에는 반대로 하나씩 끄집어 내는 연산을 하는것이다. push와 같이 요소를 꺼내는것 ..
[자료구조] 큐-2 (원형 큐) 기존의 선형 큐는 dequeue를 하면 앞 부터 쌓였던 데이터가 빠져나간다. Head는 빠져나간 자리의 다음 데이터를 가리키게 되며 비어있는 자리로는 데이터를 추가 할 수 없게 된다. 굳이 재사용을 하겠다면 dequeue를 하고 비어있는 자리를 메꾸기 위해 뒤 데이터들을 앞쪽으로 당겨야하는 작업이 필요한데 , 그렇게 되면 O(n)만큼의 시간복잡도가 발생하게 된다. 이런 비효율적인 구조를 보안한 것이 바로 원형 큐다. 원형큐의 동작이 어떻게 이뤄지는지 그림으로 보자. 순서는 좌측 상단부터 시작한다. enqueue를 진행하면서 rear는 계속 한 단계 뒤의 공간을 가리키게 된다. dequeue를 진행하면 선형 큐의 방식처럼 head(front)도 한 단계 뒤로 계속 이동한다. 선형 큐와 똑같아 보이지만 de..
[자료구조] 큐-1 이번에 정리해 볼 것은 Queue! iOS개발을 하다보면 DispatchQueue... 와 같은 Queue개념을 사용하는 API들이 존재하는데 , 큐는 선입선출(First In First Out - FIFO) 방식으로 데이터를 순서대로 관리한다. 무슨 말이냐. 데이터를 관리하는 큐 공간에 A-B-C의 데이터를 순서대로 넣었다면, 데이터를 뽑는 순서도 A-B-C가 들어간 순서 그대로를 보장한다는 것이다. 그렇기 때문에 큐는 순서를 보장해야 하는 작업을 해야할 때 주로 사용 하는 자료구조이다. 마치, 마트의 계산대에서 계산하려고 줄을 기다리는 사람들의 모양이랄까. 한 줄로 늘어선 줄은 앞에 선 사람 부터 차례로 계산을 하고 빠져나간다. 큐도 이와 같은 방식으로 동작한다고 생각하면 된다. 큐의 종류 선형 큐와..
[자료구조] 연결리스트-3 (양방향 연결 리스트) 2021.07.12 - [자료구조] - [자료구조] 연결 리스트-1 2021.07.12 - [자료구조] - [자료구조] 연결리스트-2 (추가/삭제)- 에 이은 내용 이전 포스팅의 Remove에서 마지막 노드를 삭제하기 위해 head부터 마지막 노드까지 순차적으로 이동했다. 나중에 정리하겠지만, 이렇게 삭제를 하게 될 경우 remove시도 시 데이터의 갯수만큼 시간복잡도가 증가하기 때문에 빅오 표기법으로 O(n)의 시간복잡도를 갖게 되는 최악의 알고리즘이 된다. 이를 피하기 위해서 검색알고리즘을 사용하는데 지금 우리는 알고리즘을 추가하여 시간복잡도를 줄이기 보다, Head와 마찬가지로 Tail이라는 마지막 노드를 가리키는 변수를 추가하여 마지막 노드를 삭제해보려 한다. 이때 양방향 연결리스트에 대해서 함께..
[자료구조] 연결리스트-2 (추가/삭제) 2021.07.12 - [자료구조] - [자료구조] 연결 리스트-1 에 이은 내용 앞선 포스팅에서 노드를 구성했다면 이번 포스팅에선 노드를 관리하고 추가/삭제가 용이한 연결리스트 클래스를 만들것이다. 노드클래스가 준비되었으니 바로 시작하자. LinkedList클래스를 생성하면 head라는 속성을 추가해준다. 변수명은 조금 달라도 되지만 보통 첫번째 노드를 가리키는 명칭이면 된다. head에는 LinkedList의 첫번째(0번째) 노드를 할당하자. 1. Append class LinkedList { var head: Node? func append(value: Int) { let newNode = Node(data: value) if head == nil { head = newNode } else { va..

728x90