<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.2">Jekyll</generator><link href="https://minzombie.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://minzombie.github.io/" rel="alternate" type="text/html" /><updated>2022-12-19T16:16:58+00:00</updated><id>https://minzombie.github.io/feed.xml</id><title type="html">알고 있으면 쓸데있는 블로그🧑🏼‍💻</title><subtitle>절대 최선을 다하지 말자.</subtitle><author><name>MinZombie</name></author><entry><title type="html">[Swift] CustomStringConvertible</title><link href="https://minzombie.github.io/swift/customStringConvertible/" rel="alternate" type="text/html" title="[Swift] CustomStringConvertible" /><published>2022-12-15T00:00:00+00:00</published><updated>2022-12-15T00:00:00+00:00</updated><id>https://minzombie.github.io/swift/customStringConvertible</id><content type="html" xml:base="https://minzombie.github.io/swift/customStringConvertible/">&lt;h1 id=&quot;customstringconvertible란&quot;&gt;CustomStringConvertible란?&lt;/h1&gt;
&lt;p&gt;프로토콜의 한 종류로, 인스턴스를 문자열로 커스텀할 때 사용을 한다. 특히 로그를 찍어볼 때 아주 유용하다.
&lt;br /&gt;&lt;/p&gt;
&lt;h1 id=&quot;사용법&quot;&gt;사용법&lt;/h1&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;struct Person {
    let name: String
    let age: Int
}

let god = Person(name: &quot;messi&quot;, age: 99)
print(god)

// 결과
// Person(name: &quot;messi&quot;, age: 99)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;extension Person: CustomStringConvertible {
    var description: String {
        return &quot;이름은 \(name), 나이는 \(age)살 입니다&quot;
    }
}
// 결과
// 이름은 messi, 나이는 99살 입니다
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;CustomStringConvertible 프로토콜을 채택하게 되면 description이라는 변수를 정의 해줘야한다. 여기에 정의한 문자열이 인스턴스를 표현할 때 나오게된다.
&lt;br /&gt;
&lt;br /&gt;
애플 공식문서에 보면 설명이 잘 나와있고 어렵지 않은 개념이라 쉽게 이해가 가능했다.&lt;/p&gt;</content><author><name>MinZombie</name></author><category term="swift" /><category term="swift" /><category term="CustomStringConvertible" /><summary type="html">CustomStringConvertible란? 프로토콜의 한 종류로, 인스턴스를 문자열로 커스텀할 때 사용을 한다. 특히 로그를 찍어볼 때 아주 유용하다. 사용법 ``` struct Person { let name: String let age: Int }</summary></entry><entry><title type="html">Moya 라이브러리에서 하나의 key와 여러 value로 파라미터를 url에 넣을 때 생기는 문제 해결 방법</title><link href="https://minzombie.github.io/ios/moyaParameters/" rel="alternate" type="text/html" title="Moya 라이브러리에서 하나의 key와 여러 value로 파라미터를 url에 넣을 때 생기는 문제 해결 방법" /><published>2022-11-23T00:00:00+00:00</published><updated>2022-11-23T00:00:00+00:00</updated><id>https://minzombie.github.io/ios/moyaParameters</id><content type="html" xml:base="https://minzombie.github.io/ios/moyaParameters/">&lt;p&gt;&lt;span style=&quot;color:red&quot;&gt;name=”first”&amp;amp;name=”second”&amp;amp;name=”third”&lt;/span&gt; 의 url을 기대하고 아래와 같이 작성을 했는데
&lt;img src=&quot;https://user-images.githubusercontent.com/78908490/203363327-7a335f43-e72d-4e7c-8057-22a553a8440f.png&quot; /&gt;
결과는 아래 처럼 %5B%5D 값이 들어가서 api 호출이 제대로 되지 않는다.
&lt;span style=&quot;color: red&quot;&gt;name%5B%5D=first&amp;amp;name%5B%5D=second&amp;amp;name%5B%5D=third&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;알아보니 똑같은 key에 여러 value를 적용하려고 배열을 사용할 때 [] 대괄호까지 인식을 해버려서 생긴 문제였다.&lt;/p&gt;

&lt;p&gt;alamofire github을 참고해서 해결 방법을 찾았는데, 아래 스샷처럼 작성했더니 더 이상 대괄호를 인식하지 않고 &lt;span style=&quot;color: red&quot;&gt;name=first&amp;amp;name=second&amp;amp;name=third&lt;/span&gt; 처럼 원하는 주소가 나왔다.
&lt;img src=&quot;https://user-images.githubusercontent.com/78908490/203365647-4efcbf76-d176-48f7-9de4-f0743ecdfa0b.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;URLEncoding할 때 대괄호를 포함하는게 default여서 noBrackets 옵션으로 바꿔야한다&lt;/p&gt;</content><author><name>MinZombie</name></author><category term="ios" /><category term="ios" /><category term="moya" /><summary type="html">name=”first”&amp;amp;name=”second”&amp;amp;name=”third” 의 url을 기대하고 아래와 같이 작성을 했는데 결과는 아래 처럼 %5B%5D 값이 들어가서 api 호출이 제대로 되지 않는다. name%5B%5D=first&amp;amp;name%5B%5D=second&amp;amp;name%5B%5D=third</summary></entry><entry><title type="html">DerivedData에 있는 폴더 정리 후 SPM 라이브러리 못찾는 문제</title><link href="https://minzombie.github.io/ios/missingPackage/" rel="alternate" type="text/html" title="DerivedData에 있는 폴더 정리 후 SPM 라이브러리 못찾는 문제" /><published>2022-10-23T00:00:00+00:00</published><updated>2022-10-23T00:00:00+00:00</updated><id>https://minzombie.github.io/ios/missingPackage</id><content type="html" xml:base="https://minzombie.github.io/ios/missingPackage/">&lt;p&gt;아래와 같은 에러가 뜨면서 빌드가 안되는데&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/78908490/197396461-f950363b-b4dc-4cfb-b5ad-d66bca6187b7.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Xcode -&amp;gt; File -&amp;gt; Packages -&amp;gt; &lt;span style=&quot;color: red&quot;&gt;Resolve Package versions&lt;/span&gt;을 누르면 해결이 된다&lt;/p&gt;</content><author><name>MinZombie</name></author><category term="ios" /><category term="ios" /><category term="spm" /><summary type="html">아래와 같은 에러가 뜨면서 빌드가 안되는데</summary></entry><entry><title type="html">TIL 23</title><link href="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/23/" rel="alternate" type="text/html" title="TIL 23" /><published>2021-10-31T00:00:00+00:00</published><updated>2021-10-31T00:00:00+00:00</updated><id>https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/23</id><content type="html" xml:base="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/23/">&lt;h1 id=&quot;오늘-배운-것&quot;&gt;오늘 배운 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;GCD
    &lt;ul&gt;
      &lt;li&gt;헷갈리는게 많았던 기술이여서 정리한 내용을 간단하게 먼저
        &lt;ul&gt;
          &lt;li&gt;큐는 다른 쓰레드로 보내는 작업을 한다.&lt;/li&gt;
          &lt;li&gt;직렬큐는 다른 쓰레드로 작업을 몰아주고, 동시큐는 여러 쓰레드로 작업을 나눠준다.&lt;/li&gt;
          &lt;li&gt;클로저 안에 있는 코드들이 하나의 작업이다. 이 하나의 작업이 다 같이 다른 쓰레드로 보내지고, 클로저 안에 있는 코드들은 동기로 실행된다.&lt;/li&gt;
          &lt;li&gt;비동기는 작업을 보내고 바로 다른일을 한다. 동기는 작업을 보내고 기다린다. 작업을 보낸 자리에 block이 생긴다.
            &lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;c1&quot;&gt;// 어떤 큐? -&amp;gt; 디스패치 큐&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// 큐의 특성은? -&amp;gt; 메인(직렬)&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// 동기 아니면 비동기? -&amp;gt; 비동기&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// 다른 쓰레드에 보내는 작업&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;            &lt;/div&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;쓰레드를 하나만 사용할 때 작은 작업은 문제가 없는데, 큰 작업같은 경우는 화면 버벅임 같은 문제가 생길 수 있다. 이를 해결 하기 위해서는 여러개의 쓰레드를 사용해야 하는데 애플이 만든 GCD라는 기술을 사용하면 된다.&lt;/li&gt;
      &lt;li&gt;어떻게 하면 여러 쓰레드에서 작업을 처리할 수 있을까? Queue에 처리하고 싶은 작업을 보내기만 하면 된다. 그 이후로는 OS가 알아서 쓰레드로 작업을 보낸다. Queue에 들어간 먼저 들어간 작업이 먼저 나가는 방식이다(선입선출). 우리가 직접 쓰레드를 생성할 수 있지만 이와 관련된 지식이 없으면 성능이 오히려 저하가 된다.&lt;/li&gt;
      &lt;li&gt;Queue에는 두 가지가 있는데 첫번째는 DispatchQueue 두번째는 OperationQueue다. 주로 DispatchQueue를 사용한다.
        &lt;ul&gt;
          &lt;li&gt;차이점:
            &lt;ul&gt;
              &lt;li&gt;DispatchQueue: 주로 간단한 작업처리할 때 사용&lt;/li&gt;
              &lt;li&gt;OperationQueue: 복잡한 작업에서 사용. 취소, 순서지정, 일시중지 같은 기능이 있고, DispatchQueue 기반으로 만들어졌다.&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;동기 vs 비동기
        &lt;ul&gt;
          &lt;li&gt;동기: 메인 쓰레드에서 다른 쓰레드로 작업을 보내면, 보낸 작업이 끝날 때까지 기다리는 것. 기다리는 동안 다른일을 하지 않는다. 보낸 작업이 끝나야 다른 작업을 시작한다.&lt;/li&gt;
          &lt;li&gt;비동기: 비동기는 다른 쓰레드로 보낸 작업을 기다리지 않고 다음 작업을 바로 시작한다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;직렬 vs 동시
        &lt;ul&gt;
          &lt;li&gt;직렬과 동시는 큐의 특성에 관한 것이다.&lt;/li&gt;
          &lt;li&gt;직렬: 큐가 받아들인 작업을 다른 쓰레드로 보내는데 하나의 쓰레드에 작업을 몰아준다.&lt;/li&gt;
          &lt;li&gt;동시: 큐가 여러개의 쓰레드로 보내는 것을 의미한다. 몇개인지 어떤 쓰레드인지는 OS가 결정한다.&lt;/li&gt;
          &lt;li&gt;여기서 무조건 동시가 좋아보이고 직렬은 쓸모 없어 보이지만, 직렬은 순서가 중요한 작업을 할 때 필요하다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;DispatchQueue의 종류에는 세 가지가 있다. main, global, custom
        &lt;ul&gt;
          &lt;li&gt;main: 메인쓰레드를 뜻하고 한 개만 존재한다. 그리고 위에서 말한 직렬이다.&lt;/li&gt;
          &lt;li&gt;global: global은 위에서 말한 동시 특성이다. 글로벌큐는 QoS라는 중요도 설정을 가지고 있다. 중요도에 따라 작업을 더 빠르게 처리하고 쓰레드를 더 많이 사용할 수 있다.&lt;/li&gt;
          &lt;li&gt;custom: 디폴트 설정은 직렬이지만 동시성으로 설정이 가능하다. 만드는 방법은 DispatchQueue에 label을 붙여주면 된다. OS가 알아서 QoS를 추론한다.
            &lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kt&quot;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;attributes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;concurrent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;            &lt;/div&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;GCD 사용시 주의할 점
        &lt;ul&gt;
          &lt;li&gt;UI는 반드시 메인큐에서만 처리해야 한다.&lt;/li&gt;
          &lt;li&gt;sync 주의 사항
            &lt;ul&gt;
              &lt;li&gt;메인 쓰레드에서 네트워크 작업을 다른 쓰레드로 보낼 때, sync로 보내게 되면 작업이 끝날 때 까지 UI가 멈춰버린다&lt;/li&gt;
              &lt;li&gt;async 코드 안에서 같은 큐의 sync를 생성하면 Deadlock이 발생할 수 있다.
                &lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kt&quot;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// Something&lt;/span&gt;

      &lt;span class=&quot;kt&quot;&gt;DispatchQueue&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sync&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// 코드를 보면 global이라는 같은 큐이고, async안에 sync가 있다.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// 예를 들어서 global().async 클로저 안에 있는 작업을 2번 쓰레드로 보냈다고 하자&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// 작업들이 2번 쓰레드에 있는데 global().sync가 가지고 있는 작업을 동기로 보내게 되면 그 자리에는 block 형성이 돼있는데, 큐로간 작업은 block이 있는 자리로 다시 작업을 보내려고 한다. 이 때 Deadlock이 발생한다.&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// 위의 예시 코드가 항상 Deadlock이 발생하는 것은 아니다. 큐에서는 매번 같은 쓰레드로 작업을 보내는 것이 아니기 때문이다. 하지만 이런식의 코드는 Deadlock이 발생할 수 있다는 것을 명심하자.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;                &lt;/div&gt;
              &lt;/li&gt;
              &lt;li&gt;weak, strong 캡쳐 주의
                &lt;ul&gt;
                  &lt;li&gt;클로저라서 작업을 보낼 때 캡쳐가 발생한다.&lt;/li&gt;
                  &lt;li&gt;예를 들어서 뷰컨트롤러 안에서 큐를 사용할 때 weak self를 써주면 뷰컨트롤러가 dismiss 될 때 큐로 보낸 작업들도 같이 사라진다. 하지만 weak self를 써주지 않으면 강한 참조(strong)이 되기 때문에 뷰컨트롤러가 사라져도 참조가 남아 있어 클로저 안에서는 뷰컨트롤러가 살아있다.&lt;/li&gt;
                &lt;/ul&gt;
              &lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>MinZombie</name></author><category term="개발 일지" /><summary type="html">오늘 배운 것 GCD 헷갈리는게 많았던 기술이여서 정리한 내용을 간단하게 먼저 큐는 다른 쓰레드로 보내는 작업을 한다. 직렬큐는 다른 쓰레드로 작업을 몰아주고, 동시큐는 여러 쓰레드로 작업을 나눠준다. 클로저 안에 있는 코드들이 하나의 작업이다. 이 하나의 작업이 다 같이 다른 쓰레드로 보내지고, 클로저 안에 있는 코드들은 동기로 실행된다. 비동기는 작업을 보내고 바로 다른일을 한다. 동기는 작업을 보내고 기다린다. 작업을 보낸 자리에 block이 생긴다. // 어떤 큐? -&amp;gt; 디스패치 큐 // 큐의 특성은? -&amp;gt; 메인(직렬) // 동기 아니면 비동기? -&amp;gt; 비동기 DispatchQueue.main.async { // 다른 쓰레드에 보내는 작업 }</summary></entry><entry><title type="html">TIL 22</title><link href="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/22/" rel="alternate" type="text/html" title="TIL 22" /><published>2021-09-29T00:00:00+00:00</published><updated>2021-09-29T00:00:00+00:00</updated><id>https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/22</id><content type="html" xml:base="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/22/">&lt;h1 id=&quot;오늘-배운-것&quot;&gt;오늘 배운 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;h2 id=&quot;공식-문서를-보자&quot;&gt;공식 문서를 보자!!&lt;/h2&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;h2 id=&quot;mac-catalyst&quot;&gt;Mac Catalyst&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;iPad용 코드로 Mac 앱을 만들 수 있는 기능?이다. 맥 앱은 AppKit을 사용하는데 AppKit API 안에 Mac Catalyst용 API만 사용 가능하다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;h2 id=&quot;cocoa-touch-framework&quot;&gt;Cocoa Touch Framework&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;iOS에서 사용하는 Foundation, UIKit을 포함한 프레임워크다.&lt;/li&gt;
      &lt;li&gt;Foundation = Foundation은 root class인 NSObject를 구현하고 기본 데이터 형식(ex: String, Int), 컬렉션(ex: Array, dictionaries), 파일 관리, XML 처리, 객체 지속성, internationalization, 네트워크 기능을 제공한다. 또한 포트, 스레드, 프로세스에 엑세스 할 수 있다. 그리고 Core Foundation를 기반으로 하고 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;h2 id=&quot;xcode-snippet&quot;&gt;Xcode Snippet&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;자주 사용하는 코드를 저장해놓고 재사용 할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;h2 id=&quot;전처리문--컴파일-전에-미리-처리하는-문장&quot;&gt;전처리문 = 컴파일 전에 미리 처리하는 문장&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;#if … #endif
```swift
#if DEBUG
import SwiftUI
….
#endif&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;#if os(iOS)
print(“iOS”)
#elseif os(MacOS)
print(“MacOS”)
#endif&lt;/p&gt;

&lt;p&gt;#if TAGET_OS_IOS // TAGET_OS 같은 경우 Objective-C에서 사용하는데 스위프트에서 사용해도 돌아간다.
print(“iOS”)
#endif&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;
&amp;lt;br&amp;gt;

- ## iOS 13 미만에서 빌드할 때 에러 해결 방법
    - 어제 알아봤을 때는 SceneDelegate파일을 삭제하고 Info.plist에서 항목을 삭제 했는데 오늘 더 좋은 방법을 배웠다.
    - @availabel(iOS 13.0, *)는 iOS 13 이상에서만 가능하다는 뜻이다. 그래서 굳이 삭제 해주지 않아도 빌드가 된다.

&amp;lt;br&amp;gt;

- ## AutoLayout 코드로 구현
    - 스토리보드로 할 때랑 원리는 같다. 단지 코드로 구현한다고 생각하면 된다.
    - 오토레이아웃 핵심 = x,y 위치 그리고 가로,세로 크기
```swift
// translatesAutoresizingMaskIntoConstraints 프로퍼티는 꼭 false로 해야한다
// true일 경우 autoresizing mask로 constraint를 뷰의 위치와 크기를 잡는다는 뜻이다 = 내가 원하는 constraint를 할 수 없다
randomButton.translatesAutoresizingMaskIntoConstraints = false

// 위치지정        
randomButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
randomButton.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 20).isActive = true
randomButton.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -20).isActive = true
randomButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -20).isActive = true

// 크기지정        
randomButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scene이란? 기능은?
    &lt;ul&gt;
      &lt;li&gt;쉽게 생각하면 앱에 보여지는 화면이다.&lt;/li&gt;
      &lt;li&gt;scene은 window와 view controllers를 포함하고 있고, 각 scene은 UIWindowSceneDelegate를 가지고 있다. 그리고 같은 메로리, 앱 프로세스를 공유하면서 동시에 실행한다.&lt;/li&gt;
      &lt;li&gt;iOS 13 이상 부터는 window가 Scene으로 대체되었다.
        &lt;ul&gt;
          &lt;li&gt;window = View의 컨테이너 역할을 하고 이벤트 처리를 한다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;window와 scene의 차이점은 scene은 앱 하나에 여러개의 scene이 들어가 있을 수 있다. 하지만 window는 하나뿐이였다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</content><author><name>MinZombie</name></author><category term="개발 일지" /><summary type="html">오늘 배운 것 공식 문서를 보자!!</summary></entry><entry><title type="html">TIL 21</title><link href="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/21/" rel="alternate" type="text/html" title="TIL 21" /><published>2021-09-28T00:00:00+00:00</published><updated>2021-09-28T00:00:00+00:00</updated><id>https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/21</id><content type="html" xml:base="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/21/">&lt;h1 id=&quot;오늘-배운-것&quot;&gt;오늘 배운 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;Metal API란?
    &lt;ul&gt;
      &lt;li&gt;애플에서 만든 그래픽 API이다. 과거에는 Open GL을 사용하였으나 현재 Metal로 대체 되었고, UIKit, MapKit 등등 그래픽이 들어가는 프레임워크에도 들어가있다.&lt;/li&gt;
      &lt;li&gt;Metal의 성능은 모든 GPU를 지원하지 않는다는 단점이 있지만 바이너리로 변환시 간단해 속도가 더 빠르다는 장점이 있다&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;스토리보드를 활용해서 원형 이미지뷰를 만들 수 있다.
    &lt;ul&gt;
      &lt;li&gt;스토리보드 - 이미지뷰 - identify inspector - User Defined Runtime Attributes 항목에서 Key Path에 layer.cornerRadius를 작성하고 Number 타입에 원하는 값을 주면 된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;모르는-것&quot;&gt;모르는 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;UIScene이란? 기능은?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;h1 id=&quot;해결한-것&quot;&gt;해결한 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;최소 버전을 12.0 이상으로 하고 빌드하면 에러가 발생한다. 왜 그럴까?
    &lt;ul&gt;
      &lt;li&gt;UIScene(UISceneDelegate, UISceneSession 등등 UIScene 붙은 이름들) 때문인데, UIScene은 iOS버전 13이상 부터 가능하다. 그래서 12.0 버전으로 빌드를 하게되면 컴파일 에러가 난다.&lt;/li&gt;
      &lt;li&gt;에러 해결 방법은?
        &lt;ol&gt;
          &lt;li&gt;SceneDelegate 파일 삭제 ( UIScene 관련 된 것들은 13이상에서 가능하니 필요가 없다 )&lt;/li&gt;
          &lt;li&gt;Info.plist 에서 Application Scene Manifest 항목 삭제&lt;/li&gt;
          &lt;li&gt;AppDelegate 파일에서 // MARK: UISceneSession LifeCycle 아래 두 개의 메서드 삭제&lt;/li&gt;
          &lt;li&gt;AppDelegate 파일에서 var window: UIWindow? 변수 추가
            &lt;ul&gt;
              &lt;li&gt;변수를 추가하지 않고 빌드를 하게 되면 화면이 검은색으로 나온다 왜 그럴까?&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ol&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;</content><author><name>MinZombie</name></author><category term="개발 일지" /><summary type="html">오늘 배운 것 Metal API란? 애플에서 만든 그래픽 API이다. 과거에는 Open GL을 사용하였으나 현재 Metal로 대체 되었고, UIKit, MapKit 등등 그래픽이 들어가는 프레임워크에도 들어가있다. Metal의 성능은 모든 GPU를 지원하지 않는다는 단점이 있지만 바이너리로 변환시 간단해 속도가 더 빠르다는 장점이 있다 스토리보드를 활용해서 원형 이미지뷰를 만들 수 있다. 스토리보드 - 이미지뷰 - identify inspector - User Defined Runtime Attributes 항목에서 Key Path에 layer.cornerRadius를 작성하고 Number 타입에 원하는 값을 주면 된다.</summary></entry><entry><title type="html">TIL 20</title><link href="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/20/" rel="alternate" type="text/html" title="TIL 20" /><published>2021-09-25T00:00:00+00:00</published><updated>2021-09-25T00:00:00+00:00</updated><id>https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/20</id><content type="html" xml:base="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/20/">&lt;h1 id=&quot;오늘-배운-것&quot;&gt;오늘 배운 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;네트워크
    &lt;ul&gt;
      &lt;li&gt;CSMA/CD = 같은 도메인 내에서 동시에 데이터를 보내면 충돌할 수 있어서 충돌을 피하기 위해 사용 되는 프로토콜이다. 충돌을 완전히 막을 수는 없다고 한다. 수신하는 쪽에서 데이터를 받고 있지 않는다면 데이터를 보내고, 데이터를 다른곳에서 받고 있다면 대기하다가 보낸다.&lt;/li&gt;
      &lt;li&gt;MAC 주소 = 물리주소 라고도 불린다. 랜카드에 앞에는 제조사 번호 24비트, 뒤에는 제조사가 붙인 번호 24비트로 총 48로 구성돼있다.&lt;/li&gt;
      &lt;li&gt;데이터링크 계층에서는 이더넷 헤더와 트레일러를 붙인다. 이더넷 헤더에는 목적지 MAC 주소와 출발지 MAC 주소 그리고 유형이 들어있다. 트레일러에는 오류가 발생하는지 확인하는 용도이다. 헤더와 트레일러가 추가된 데이터를 프레임이라 부른다.
        &lt;ul&gt;
          &lt;li&gt;유형 = 상위 프로토콜의 종류를 나타낸다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;스위치 = 데이터 링크 계층에서 동작. 허브에서 처럼 데이터를 보내면 모든 컴퓨터에 전달되지 않고 보내고자 하는 컴퓨터에만 전달이 된다. MAC 주소 테이블(스위치 포트 번호 + MAC 주소)을 가지고 있다.&lt;/li&gt;
      &lt;li&gt;전이중 통신 = 송수신을 동시에&lt;/li&gt;
      &lt;li&gt;반이중 통신 = 회선 하나로 송신,수신을 번갈아 가면서 한다.
        &lt;ul&gt;
          &lt;li&gt;랜선으로 직접 연결 한 경우, 스위치는 전이중. 전이중은 충돌이 되지 않는다.&lt;/li&gt;
          &lt;li&gt;허브는 반이중&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;충돌 도메인 = 반이중 통신시 충돌되는 도메인을 뜻한다. 허브같은 경우는 충돌시 연결된 모든 컴퓨터가 충돌 도메인이 된다.&lt;/li&gt;
      &lt;li&gt;ARP = IP주소를 활용해서 MAC 주소를 찾는 프로토콜. 데이터 링크 계층 주소와 네트워크 계층 주소 사이의 변환을 담당. MAC 주소를 찾게되면 캐시로 저장한다. 하지만 IP 주소가 바뀌게 되면 MAC 주소도 바뀌게 되어서 이전 MAC 주소를 더 이상 사용할 수 없다. 그래서 캐시를 주기적으로 삭제하고 다시 주소를 요청한다.
&lt;br /&gt;
&lt;br /&gt;
        &lt;h1 id=&quot;모르는-것&quot;&gt;모르는 것&lt;/h1&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;iPhone 기기마다 사이즈가 다른데 폰트 크기를 다르게 적용하는 방법은 무엇일까? (iPad도 마찬가지)&lt;/li&gt;
  &lt;li&gt;Metal API, Open GL이란?
&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>MinZombie</name></author><category term="개발 일지" /><summary type="html">오늘 배운 것 네트워크 CSMA/CD = 같은 도메인 내에서 동시에 데이터를 보내면 충돌할 수 있어서 충돌을 피하기 위해 사용 되는 프로토콜이다. 충돌을 완전히 막을 수는 없다고 한다. 수신하는 쪽에서 데이터를 받고 있지 않는다면 데이터를 보내고, 데이터를 다른곳에서 받고 있다면 대기하다가 보낸다. MAC 주소 = 물리주소 라고도 불린다. 랜카드에 앞에는 제조사 번호 24비트, 뒤에는 제조사가 붙인 번호 24비트로 총 48로 구성돼있다. 데이터링크 계층에서는 이더넷 헤더와 트레일러를 붙인다. 이더넷 헤더에는 목적지 MAC 주소와 출발지 MAC 주소 그리고 유형이 들어있다. 트레일러에는 오류가 발생하는지 확인하는 용도이다. 헤더와 트레일러가 추가된 데이터를 프레임이라 부른다. 유형 = 상위 프로토콜의 종류를 나타낸다. 스위치 = 데이터 링크 계층에서 동작. 허브에서 처럼 데이터를 보내면 모든 컴퓨터에 전달되지 않고 보내고자 하는 컴퓨터에만 전달이 된다. MAC 주소 테이블(스위치 포트 번호 + MAC 주소)을 가지고 있다. 전이중 통신 = 송수신을 동시에 반이중 통신 = 회선 하나로 송신,수신을 번갈아 가면서 한다. 랜선으로 직접 연결 한 경우, 스위치는 전이중. 전이중은 충돌이 되지 않는다. 허브는 반이중 충돌 도메인 = 반이중 통신시 충돌되는 도메인을 뜻한다. 허브같은 경우는 충돌시 연결된 모든 컴퓨터가 충돌 도메인이 된다. ARP = IP주소를 활용해서 MAC 주소를 찾는 프로토콜. 데이터 링크 계층 주소와 네트워크 계층 주소 사이의 변환을 담당. MAC 주소를 찾게되면 캐시로 저장한다. 하지만 IP 주소가 바뀌게 되면 MAC 주소도 바뀌게 되어서 이전 MAC 주소를 더 이상 사용할 수 없다. 그래서 캐시를 주기적으로 삭제하고 다시 주소를 요청한다. 모르는 것 iPhone 기기마다 사이즈가 다른데 폰트 크기를 다르게 적용하는 방법은 무엇일까? (iPad도 마찬가지) Metal API, Open GL이란?</summary></entry><entry><title type="html">TIL 19</title><link href="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/19/" rel="alternate" type="text/html" title="TIL 19" /><published>2021-09-20T00:00:00+00:00</published><updated>2021-09-20T00:00:00+00:00</updated><id>https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/19</id><content type="html" xml:base="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/19/">&lt;h1 id=&quot;오늘-배운-것&quot;&gt;오늘 배운 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;네트워크
    &lt;ul&gt;
      &lt;li&gt;트위스트 페어 케이블: 랜 케이블이라고도 한다.  UTP, STP 두 종류가 있다
        &lt;ul&gt;
          &lt;li&gt;UTP: 절연체로 감싸여 있지 않아서 가격이 싸다. 그 대신 외부의 물리충격에 약하다.&lt;/li&gt;
          &lt;li&gt;STP: 절연체로 둘러싸여 있어서 노이즈의 영향을 적게 받고 비싸다. 일반적으로 잘 사용하지 않는다.&lt;/li&gt;
          &lt;li&gt;다이렉트 케이블: 케이블이 번호 순서대로 연결돼있다(1번은 1번, 2번은 2번). 컴퓨터와 스위치 연결할때 사용한다&lt;/li&gt;
          &lt;li&gt;크로스 케이블: 컴퓨터 간에 직접 랜 케이블로 연결할 떄 사용한다.
            &lt;ul&gt;
              &lt;li&gt;다이렉트 케이블과 크로스 케이블 둘 다 1,2,3,6번 구리 선만 사용하고 나머지는 사용x&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;리피터: 물리계층에서 동작하는 네트워크 장비. 컴퓨터 사이에서 신호가 약해졌을 때 신호를 증폭시켜준다. 요즘에는 허브가 있어서 사용하지 않는다.&lt;/li&gt;
      &lt;li&gt;허브: 여러개 컴퓨터를 연결할 수 있다. 리피터와 같은 기능을 가지고 있다. 데이터 전송시 연결된 모든 컴퓨터에 전송된다는 단점이 있다. 그 대안으로 스위치라는 장비가 있다.&lt;/li&gt;
      &lt;li&gt;데이터링크 계층에서는 네트워크 장비들이 신호를 주고받는 규칙을 정하는 곳이다. 가장 많이 사용하는 규칙은 이더넷이라는 규칙이다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;xib, nib 차이점
&lt;br /&gt;
&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;모르는-점&quot;&gt;모르는 점&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;뷰를 코드로 구현하면 왜 required init?(coder: NSCoder) { super.init(coder: coder) } 이 코드가 필요할까?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;
&lt;h1 id=&quot;해결한-것&quot;&gt;해결한 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;resignFirstResponder이란?
    &lt;ul&gt;
      &lt;li&gt;window에서 first responder를 포기하게 해서 input view(키보드,입력 받는 뷰)를 사라지게 한다. 이 메소드를 이용해서 키보드를 사라지는 기능을 만들 수 있다.&lt;/li&gt;
      &lt;li&gt;텍스트필드 같이 입력 받는 뷰를 탭하면 텍스트필드가 first responder를 받게 돼서 키보드가 화면에 표시된다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>MinZombie</name></author><category term="개발 일지" /><summary type="html">오늘 배운 것 네트워크 트위스트 페어 케이블: 랜 케이블이라고도 한다. UTP, STP 두 종류가 있다 UTP: 절연체로 감싸여 있지 않아서 가격이 싸다. 그 대신 외부의 물리충격에 약하다. STP: 절연체로 둘러싸여 있어서 노이즈의 영향을 적게 받고 비싸다. 일반적으로 잘 사용하지 않는다. 다이렉트 케이블: 케이블이 번호 순서대로 연결돼있다(1번은 1번, 2번은 2번). 컴퓨터와 스위치 연결할때 사용한다 크로스 케이블: 컴퓨터 간에 직접 랜 케이블로 연결할 떄 사용한다. 다이렉트 케이블과 크로스 케이블 둘 다 1,2,3,6번 구리 선만 사용하고 나머지는 사용x 리피터: 물리계층에서 동작하는 네트워크 장비. 컴퓨터 사이에서 신호가 약해졌을 때 신호를 증폭시켜준다. 요즘에는 허브가 있어서 사용하지 않는다. 허브: 여러개 컴퓨터를 연결할 수 있다. 리피터와 같은 기능을 가지고 있다. 데이터 전송시 연결된 모든 컴퓨터에 전송된다는 단점이 있다. 그 대안으로 스위치라는 장비가 있다. 데이터링크 계층에서는 네트워크 장비들이 신호를 주고받는 규칙을 정하는 곳이다. 가장 많이 사용하는 규칙은 이더넷이라는 규칙이다.</summary></entry><entry><title type="html">[iOS] xib과 nib 차이점</title><link href="https://minzombie.github.io/ios/xibAndNib/" rel="alternate" type="text/html" title="[iOS] xib과 nib 차이점" /><published>2021-09-19T00:00:00+00:00</published><updated>2021-09-19T00:00:00+00:00</updated><id>https://minzombie.github.io/ios/xibAndNib</id><content type="html" xml:base="https://minzombie.github.io/ios/xibAndNib/">&lt;ul&gt;
  &lt;li&gt;xib (Xml Interface Builder)하고 nib (NeXT Interface Builder)의 기능은 동일하나 xib는 xml 기반이고 nib은 바이너리 기반으로 이루어져있다.&lt;/li&gt;
  &lt;li&gt;nib은 형상 관리 툴(Git 같은 것)하고 같이 사용할 때 문제가 있다. 그래서 xib로 대체해서 사용 중이다.&lt;/li&gt;
  &lt;li&gt;xib는 컴파일시 nib으로 변환된다.&lt;/li&gt;
&lt;/ul&gt;</content><author><name>MinZombie</name></author><category term="ios" /><category term="swift" /><category term="xib" /><category term="nib" /><summary type="html">xib (Xml Interface Builder)하고 nib (NeXT Interface Builder)의 기능은 동일하나 xib는 xml 기반이고 nib은 바이너리 기반으로 이루어져있다. nib은 형상 관리 툴(Git 같은 것)하고 같이 사용할 때 문제가 있다. 그래서 xib로 대체해서 사용 중이다. xib는 컴파일시 nib으로 변환된다.</summary></entry><entry><title type="html">TIL 18</title><link href="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/18/" rel="alternate" type="text/html" title="TIL 18" /><published>2021-09-17T00:00:00+00:00</published><updated>2021-09-17T00:00:00+00:00</updated><id>https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/18</id><content type="html" xml:base="https://minzombie.github.io/%EA%B0%9C%EB%B0%9C%20%EC%9D%BC%EC%A7%80/18/">&lt;h1 id=&quot;오늘-배운-것&quot;&gt;오늘 배운 것&lt;/h1&gt;
&lt;ul&gt;
  &lt;li&gt;네트워크
    &lt;ul&gt;
      &lt;li&gt;OSI 모델: 네트워크에서 데이터 전송할 때 필요한 일곱 개 계층으로 이루어진 통신 규약이다. 상위계층 부터 응용, 표현, 세션, 전송, 네트워크, 데이터 링크, 물리 계층 순이다.&lt;/li&gt;
      &lt;li&gt;TCP/IP 모델: OSI 모델의 일곱 계층을 네 개 계층으로 단순화
        &lt;ul&gt;
          &lt;li&gt;응용, 전송, 인터넷, 네트워크 접속 계층이 있다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;캡슐화: 상위 계층의 프로토콜 정보를 데이터에 추가하여 하위 계층에 전송하는 기술
        &lt;ul&gt;
          &lt;li&gt;프로토콜의 정보를 데이터에 추가하는 것을 헤더라고 한다.&lt;/li&gt;
          &lt;li&gt;트레일러: 데이터 마지막에 추가 되는 정보를 말한다.&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;물리계층: 0, 1로 이루어진 데이터를 전기신호로 바꾸는 일을 한다. 이 일을 랜 카드가 한다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;FloatingPanel
    &lt;ul&gt;
      &lt;li&gt;뷰컨트롤러 위에 다른 뷰컨트롤러가 떠있고 아래에서 위로 올릴 수 있는 형태&lt;/li&gt;
      &lt;li&gt;직접구현을 해봤지만 UI, 제스쳐등 모든 것을 구현해야 해서 더 쉽게 할 수 있도록 라이브러리를 써서 구현해봤다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;cocoapods
&lt;br /&gt;  &lt;br /&gt;
&lt;br /&gt;
    &lt;h1 id=&quot;모르는-점&quot;&gt;모르는 점&lt;/h1&gt;
  &lt;/li&gt;
  &lt;li&gt;resignFirstResponder이란?
&lt;br /&gt;
&lt;br /&gt;
    &lt;h1 id=&quot;해결한-것&quot;&gt;해결한 것&lt;/h1&gt;
  &lt;/li&gt;
  &lt;li&gt;dmz란?
    &lt;ul&gt;
      &lt;li&gt;dmz: 외부에 서비스 제공시 내부 데이터를 보호하기 위해 내부, 외부 네트워크 구간 사이에 위치하여, 침입차단시스템 등으로 접근을 제한할 수 있다.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;addingPercentEncoding이란? query 받을 때 사용을 했다.
    &lt;ul&gt;
      &lt;li&gt;지정된 Set에 없는 문자들을 Encoding 할 수 있게 도와주는 메소드이다. 예를 들어 한글로 된 url은 유효하지 않은데 이 메소드를 통해서 한글도 변환이 가능하다.&lt;/li&gt;
      &lt;li&gt;CharacterSet 마다 포함하고 있는 문자가 다른데 주로 사용하는 Set은 urlQueryAllowed, urlPathAllowed이다.
        &lt;div class=&quot;language-swift highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;c1&quot;&gt;// urlQueryAllowed&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;\&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;@&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// urlPathAllowed이다&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;\&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;@&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;~&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content><author><name>MinZombie</name></author><category term="개발 일지" /><summary type="html">오늘 배운 것 네트워크 OSI 모델: 네트워크에서 데이터 전송할 때 필요한 일곱 개 계층으로 이루어진 통신 규약이다. 상위계층 부터 응용, 표현, 세션, 전송, 네트워크, 데이터 링크, 물리 계층 순이다. TCP/IP 모델: OSI 모델의 일곱 계층을 네 개 계층으로 단순화 응용, 전송, 인터넷, 네트워크 접속 계층이 있다. 캡슐화: 상위 계층의 프로토콜 정보를 데이터에 추가하여 하위 계층에 전송하는 기술 프로토콜의 정보를 데이터에 추가하는 것을 헤더라고 한다. 트레일러: 데이터 마지막에 추가 되는 정보를 말한다. 물리계층: 0, 1로 이루어진 데이터를 전기신호로 바꾸는 일을 한다. 이 일을 랜 카드가 한다. FloatingPanel 뷰컨트롤러 위에 다른 뷰컨트롤러가 떠있고 아래에서 위로 올릴 수 있는 형태 직접구현을 해봤지만 UI, 제스쳐등 모든 것을 구현해야 해서 더 쉽게 할 수 있도록 라이브러리를 써서 구현해봤다. cocoapods 모르는 점 resignFirstResponder이란? 해결한 것 dmz란? dmz: 외부에 서비스 제공시 내부 데이터를 보호하기 위해 내부, 외부 네트워크 구간 사이에 위치하여, 침입차단시스템 등으로 접근을 제한할 수 있다. addingPercentEncoding이란? query 받을 때 사용을 했다. 지정된 Set에 없는 문자들을 Encoding 할 수 있게 도와주는 메소드이다. 예를 들어 한글로 된 url은 유효하지 않은데 이 메소드를 통해서 한글도 변환이 가능하다. CharacterSet 마다 포함하고 있는 문자가 다른데 주로 사용하는 Set은 urlQueryAllowed, urlPathAllowed이다. ```swift // urlQueryAllowed ! $ &amp;amp; \ ( ) * + - . / : ; = ? @ _ ~</summary></entry></feed>