<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>cur-ios-ity.log</title>
        <link>https://velog.io/</link>
        <description>👩🏻‍💻</description>
        <lastBuildDate>Wed, 03 Aug 2022 13:41:40 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>cur-ios-ity.log</title>
            <url>https://velog.velcdn.com/images/cur-ios-ity/profile/f43156b2-0f1e-4def-bbcf-a8685c15a0c4/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. cur-ios-ity.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/cur-ios-ity" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Xcode] .gitignore 파일 쉽고 빠르게(!) 만들기]]></title>
            <link>https://velog.io/@cur-ios-ity/Xcode-.gitignore-%ED%8C%8C%EC%9D%BC-%EC%89%BD%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@cur-ios-ity/Xcode-.gitignore-%ED%8C%8C%EC%9D%BC-%EC%89%BD%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 03 Aug 2022 13:41:40 GMT</pubDate>
            <description><![CDATA[<h1 id="xcode에서-gitignore-파일-쉽고-빠르게-만들기">Xcode에서 .gitignore 파일 쉽고 빠르게(!) 만들기</h1>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6f2da0af-422d-4fc4-b068-23449998e7ed/image.png" alt="">
중요한 키값이나 개인정보(?)등의 유출을 방지하기 위한 .gitignore 생성을 아주 쉽게!!! 할 수 있는 방법을 배우게 되었다 ☺️
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/98c3b5bd-0f75-4930-8624-0ac870e76983/image.png" alt=""></p>
<p>먼저 프로젝트를 만들 때 <code>Create Git repository on my Mac</code>에 체크한다. 
깃 리포지토리가 없는 프로젝트라면,
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/19c21332-69a9-45d8-bf61-b1cbff3edfbd/image.png" alt=""></p>
<p><code>Source Control</code>에서도 생성할 수 있다.
<br><br><br><br></p>
<h2 id="gitignore-생성하기">.gitignore 생성하기</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/bba12401-614a-44ce-9981-fef7a6b2199c/image.png" alt=""></p>
<p>프로젝트를 클릭하고 <code>command + N</code> 을 누르거나,
위 스크린샷처럼 프로젝트 오른쪽 마우스 클릭 - New File 선택
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/00b5e874-d18f-4be7-a0c7-0a060078dcef/image.png" alt=""></p>
<p>밑으로 쭉쭉 내리다보면 처음보는..ㅎㅎ Empty 템플릿이 있다
선택 후 Next
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/10fdc6e8-df39-41fe-9987-3a48617958d4/image.png" alt=""></p>
<p>파일명을 <code>.gitignore</code> 라고 적는다. 점 꼭 붙여야 한다!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b9a32b49-4c28-470c-8e4d-ebe23249fd43/image.png" alt=""></p>
<p>Group도 내부 폴더가 아닌, 앱 모양(?) 프로젝트 폴더 자체인지 확인!
<strong>위치 중요하다!!!</strong>
확인이 됐다면 Create를 누른다!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c437b26c-b8e8-4277-8398-73d066674764/image.png" alt=""></p>
<p>점(.)으로 시작하는 파일명은 숨겨질 거라는 메시지다.
<code>Use &quot;.&quot;</code> 선택!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/9f303422-009a-4f4d-bf10-746e3186ba73/image.png" alt=""></p>
<p>이렇게 <code>.gitignore</code>가 생성된 것을 볼 수 있다..!
<br><br><br><br></p>
<h2 id="gitignore에-파일-등록하기">.gitignore에 파일 등록하기</h2>
<p>이제 이 <code>.gitignore</code>에 작성을 해 보자.
예를 들어 나는 <code>API Key들</code>을 담을 구조체를 작성할 <code>APIKey.Swift</code> 파일을 만들 예정이고,
이 파일이 커밋되지 않도록 미리 방지하고 싶다고 가정해 보쟝</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b90e60c2-4a3e-467b-9b0d-e88f35c2e295/image.png" alt=""></p>
<p>❗️파일을 만들기 전! <code>.gitignore</code>에 확장자명까지 똑같이 적어 놓는다
이제 <code>APIKey.swift</code>를 생성해 보자
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/115c3ef7-bf78-47c5-a57f-e656e078d13b/image.png" alt=""></p>
<p>Swift File 템플릿을 선택하고
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/dfd8abaf-c086-478e-9232-d44528a10ca1/image.png" alt=""></p>
<p><code>APIKey.swift</code>를 생성한다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e6d20e03-0712-4497-acb6-75875f745aee/image.png" alt=""></p>
<p><code>APIKey.swift</code> 옆에 <code>A</code>가 안 뜨는 것을 확인할 수 있다.
git의 추적을 받지 않고 있음!!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2f852988-e146-4441-b1ef-091b672b4cfa/image.png" alt=""></p>
<p><code>APIKey.swift</code>는 커밋창에서도 아예 뜨지 않는 것을 볼 수 있다 :)
<em>(커밋창 여는 단축키는 <code>option + command + C</code>)</em>
<br><br></p>
<h3 id="gitignore에-등록한-파일-옮기기">.gitignore에 등록한 파일 옮기기</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/71f165f5-c678-478c-a543-558ef709fe50/image.png" alt="">
<code>.gitignore</code>에 파일명을 잘 적었다면, 이렇게 경로를 바꿔도 gitignore 적용이 된다!
<br><br></p>
<p>파일을 <code>.gitignore</code>에 등록하는 방법을 알아 보았다,,
이제 폴더도 등록해서 폴더 자체를 보호(?)해 보자!
<br><br><br><br></p>
<h2 id="gitignore에-폴더-등록하기">.gitignore에 폴더 등록하기</h2>
<br>

<p><code>Keys</code>라는 폴더를 프로젝트의 내부 폴더(<code>GitTest</code>) 안에 만들 것이라고 가정을 해 보쟝
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/ce050a74-2c6a-42ce-812d-8b943cc91c69/image.png" alt=""></p>
<p>폴더 경로를 위와 같이 <code>.gitignore</code>에 작성한다
<br><br></p>
<p>이제 <code>Keys 폴더</code>를 <code>GitTest 폴더</code> 안에 만들고, <code>Keys 폴더</code> 안에 파일을 만들어 보자
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/99436eca-aa40-467f-9bcb-732ee8267611/image.png" alt=""></p>
<p><code>GitTest/Keys 폴더</code> 안에 어떤 파일을 만들든지 <code>A</code>가 뜨지 않는다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/3fb522f6-ec3a-420e-80c8-8ed56427abb9/image.png" alt=""></p>
<p>커밋 창에서도 안 뜸!
<br><br></p>
<h3 id="gitignore에-등록하지-않은-파일을-등록한-폴더로-옮기기">.gitignore에 등록하지 않은 파일을, 등록한 폴더로 옮기기</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/25036c59-3bc3-4b1b-8260-c23f9f685234/image.png" alt=""></p>
<p>하지만 <code>.gitignore</code>에 등록하지 않은, 이 <code>A</code>가 뜨는 <code>Model.swift</code>를 <code>Keys 폴더</code> 안으로 옮긴다면..?!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/4cba794f-3645-4349-bfbb-6dff6993a8a6/image.png" alt=""></p>
<p><code>A</code>가 뜬다....^^
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/8cc693d6-e571-453d-a893-b5db99d59a62/image.png" alt="">
커밋 창에도 뜬다 ^__^...
<br><br></p>
<h3 id="gitignore에-등록한-폴더-내에-생성했던-파일들을-바깥으로-빼기">.gitignore에 등록한 폴더 내에 생성했던 파일들을 바깥으로 빼기</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2bc9b3fe-a057-4a97-bbcf-a14543ddc629/image.png" alt=""></p>
<p>그럼 <code>.gitignore</code>에 작성한 <code>Keys 폴더</code>에 생성했던 파일들을, <code>Keys 폴더 바깥</code>으로 빼면 어떻게 될까?
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/5e796930-0e04-4d8a-988f-9232f9c7fc73/image.png" alt=""></p>
<p>놀랍게도 <code>A</code>가 뜨지 않는다..!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/95aa87a5-6839-4b86-8654-ffebdc5f6933/image.png" alt=""></p>
<p>커밋창에도 파일은 안 뜨지만, 옮긴 <code>New Group 폴더</code> 옆에는 <code>?</code> 물음표가 떠 있다.
얘도 헷갈리나봄..?
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c1d0db8a-e4c1-42e7-9a0d-da6b95d857cd/image.png" alt=""></p>
<p>체크해서 커밋을 해 보겠다,,
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b8f53ca5-806d-40b6-9977-360151b969e7/image.png" alt="">
커밋이 되었다....^__^
<br><br><br><br></p>
<hr>
<h2 id="정리">정리!!</h2>
<ul>
<li><code>.gitignore</code>에 작성한 <code>파일</code>은 어디로 이동하든 추적이 되지 않는다.</li>
<li><code>.gitignore</code>에 작성한 <code>폴더</code>는, 파일 생성 시 <code>그 폴더 내</code>에 생성하지 않았다면, 나중에 <code>그 폴더 내부로 옮기더라도</code> <strong>해당 파일은 추적 방지 불가</strong></li>
<li><code>.gitignore</code>에 작성한 <code>폴더 내</code>에 생성한 <code>파일</code>은, <code>해당 폴더를 벗어나면</code> <strong>추적 방지 불가</strong><br>

</li>
</ul>
<blockquote>
<p>이렇게 숨기고 싶은(깃의 추적을 피하고 싶은) 파일명을 항상 <code>.gitignore</code>에 먼저 작성해야 한다.
파일을 먼저 만들고 <code>.gitignore</code>에 작성하면 나중에 처리할 것들이 많아지기 때문에,,
<strong>항상 <code>.gitignore</code>에 먼저 작성하기..!</strong></p>
</blockquote>
<p><br><br><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Xcode] Xcode 프로젝트 이름 변경하기]]></title>
            <link>https://velog.io/@cur-ios-ity/Xcode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@cur-ios-ity/Xcode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9D%B4%EB%A6%84-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 14 Jul 2022 11:33:43 GMT</pubDate>
            <description><![CDATA[<p>잘못된 이름으로 프로젝트를 생성한 적이 많아 이름을 여러 번 변경했는데,
매번 찾기보다 직접 적어보려 한다!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/d91d3719-ec9c-4e81-b192-5269241d0e09/image.png" alt=""></p>
<p>먼저 프로젝트 네비게이터에서 이름을 바꿔 준다.
천천히 두 번 클릭해도 되고, 선택한 상태에서 return을 쳐도 된다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/9c955ed2-2520-4884-bd11-f5aa86278ba5/image.png" alt=""></p>
<p>그럼 요런 창이 뜨는데, 왼쪽에 모두 체크가 되어 있어야 하는 것 같다.
(아마 모두 체크 되어 있을 것이다)
Rename을 누른다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/be91fcff-cd02-412a-b90c-0a62a5a2e01c/image.png" alt=""></p>
<p>이게 떠서 전부 커밋하고 다시 했는데 또 떠서 그냥 Continue 누름,,
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6b03ed7b-6a6d-4f7e-9ae4-8933e8e2b483/image.png" alt=""></p>
<p>바뀐 모습!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a13f99d5-9d4a-4841-af26-a592deca5254/image.png" alt=""></p>
<p>Product ⇨ Scheme ⇨ Manage Schemes 를 누른다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/13cf6438-e030-4c01-9cdd-6950842d74cf/image.png" alt=""></p>
<p>여기서 Scheme의 이름을 바꾼다.
여기서도 천천히 두 번 클릭하거나 return을 쳐서 수정!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/cb4f5b38-f69b-4ebb-88f2-fce29bed5951/image.png" alt=""></p>
<p>Close,,,
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/60147151-3927-4133-92d0-6f48b33d0cd9/image.png" alt=""></p>
<p>파인더에서도 바꿔 준다!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/49d74a86-ce85-4d14-a398-b7d575c68a3a/image.png" alt="">
바꿈과 동시에 열려있던 프로젝트는 파일을 볼 수 없게(?) 된다..
프로젝트를 닫고 다시 열면
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e0437dfb-49b5-463a-9803-e5a8a3fa97ce/image.png" alt="">
요렇게 나온다 ㅎㅎ..
폴더 이름을 파인더에서 바꿔도 Xcode에서는 그대로다..
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/d7ef43a9-6879-4054-a434-58d644f88236/image.png" alt=""></p>
<p>꼭 안쪽 폴더로 경로를 지정해야 한다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/815a31da-dae6-4609-8466-52434466fe51/image.png" alt=""></p>
<p>Choose 눌러서 지정
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/44260e34-beba-4d3d-84c8-3980c814f288/image.png" alt=""></p>
<p>찝찝하니까 얘도 바꿔준다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b0a3bf2c-6416-419b-b785-718bf48d77bf/image.png" alt="">
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a3beed17-40a8-4cf8-803f-c0fdbbac5564/image.png" alt=""></p>
<p>빌드세팅 변경하기.</p>
<ol>
<li>프로젝트 네비게이터에서 프로젝트 선택</li>
<li>타겟 선택</li>
<li>빌드 세팅 클릭</li>
<li>Packaging 검색 (pac만 써도 나온다)</li>
<li>Info.plist File에서 값 적는 부분 더블 클릭 (Info.plist File 행 누르고 return 쳐도 되고, 값 적는 부분 천천히 두 번 클릭해도 됨)</li>
<li>이름 변경!
<br><br></li>
</ol>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/758aeb91-f5bc-46e9-90f5-4a0e6d37685d/image.png" alt=""></p>
<p>바로 밑에 Product Bundle Identifier에서도 변경해 준다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a2a7db4b-11bb-47c7-ac37-69b61772da44/image.png" alt=""></p>
<p>빌드 성공!!! 
<br><br><br><br><br></p>
<p>➕ git 관련</p>
<p>프로젝트 이름 수정 이후 커밋할 때
에셋을 포함한 많은 파일들이 변경된(?) 것처럼 보이는데,, 
전체를 선택하고 커밋하려니 did not match any file(s) known to git 이 뜨면서 커밋이 안 됐다. 
경로가 달라졌으니까(폴더 이름이 달라졌으니까) 그런 게 아닐까 싶다,,</p>
<p>커밋할 때 자동으로 선택되는 파일들만 커밋하면
커밋도 되고 푸시도 된다,, 이유는 잘 모르겠음.. . ..
그리고 다시 커밋할 때 모든 파일 선택하니까 커밋+푸시 다 잘 되었다 . ..</p>
<p>뭔가 처음 기본적으로 선택되어 있는 파일들을 통해 경로를 변경하는 과정이 먼저 필요한 걸지도 모르겠다..!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.14]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.14</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.14</guid>
            <pubDate>Thu, 14 Jul 2022 10:15:51 GMT</pubDate>
            <description><![CDATA[<h2 id="class-structure">Class(+ Structure)</h2>
<p><br><br></p>
<p>클래스, 구조체, 열거형 안에 선언된 함수는 메서드,
변수/상수는 프로퍼티라고 한다.
그리고 이 메서드와 프로퍼티를 멤버라고 부른다.
<br><br></p>
<p>코드영역에서는 코드를 갖고 있는데,
띄우지 않은 화면이나 사용하지 않은 코드는 문자 자체로 남아 있는다.</p>
<p>데이터 영역에는 전역변수가 있는데, 전역변수는 프로그램 전체적으로 사용하는 변수다. 클래스나 구조체 밖에 선언되는 변수/함수 등이다.
하지만 이렇게 하면 앱을 켰을 때부터 끌 때까지 메모리 공간을 차지하게 된다.</p>
<p>힙은 처음부터 채워지고 스택은 마지막부터 채워진다(?)
이 둘이 만나게 되면 stackoverflow
<br><br></p>
<p>클래스의 실질적인 값은 힙에 저장되고,
이 힙의 주소를 갖는 부분은 스택에 저장된다.
<br></p>
<p>클래스의 인스턴스들은 스택에서 다른 주소를 차지하더라도
가리키는 주소(힙 주소)는 같다.</p>
<p>따라서 한 인스턴스에서 프로퍼티의 값을 바꾸면
힙의 실질적 값이 변경되는 것이기 때문에
다른 인스턴스에서도 변경된 값으로 보인다.
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b29ca668-4605-42f0-81d0-3e63ea33d64b/image.png" alt=""></p>
<p>그렇기 때문에 수정할 때 각각을 수정하는 것 같아도 결국 같은 것을 수정하게 되는 것이다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6a9177aa-bd2f-4abf-8c40-7f84a58c8dd7/image.png" alt=""></p>
<p>struct는 각각이다.
<br><br><br></p>
<p>위에서
클래스의 실질적인 값은 힙에 저장되고,
이 힙의 주소를 갖는 부분은 스택에 저장된다고 했는데, </p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e3a2dcfa-1677-430a-af9a-fb1561fc372c/image.png" alt=""></p>
<p>그렇기 때문에 위와 같은 코드에서처럼 let 으로 선언되어도 오류가 나지 않는다.
여기서 let은 &#39;스택에 있는 easy&#39;가 가지는(가리키는) &#39;힙 주소&#39;를 못 바꾼다는 의미다.
그 주소에 있는 변수(프로퍼티)들은 var이기 때문에 바꾸기가 가능하다.
(Class는 let이어도 바꿀 수 있지만 Struct는 바꿀 수 없다.)
<br><br></p>
<p>뷰 예시를 보자,,</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/65329332-92d3-46e0-abca-d779dabeb95f/image.png" alt=""></p>
<p>여기에서 alert가 클래스이기 때문에, let으로 선언해도 addAction등이 가능하다!
<br><br></p>
<p>위의 수정 예시를 뷰로 또 들어 보자,,</p>
<p><code>alert2</code> 를 만들고
<code>alert2 = alert</code> 후
<code>alert2</code> 를 수정하고
<code>alert</code>(기존)을 present 해 보자!</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/4876047b-5421-4282-a381-16c1e74bd7a6/image.png" alt=""></p>
<p>이렇게,,
<br><br></p>
<p>결과는,,,,</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/dd44edd7-99d5-42d7-a6d9-81f5f3d55c9f/image.png" alt=""></p>
<p>ㄴ(°0°)ㄱ</p>
<p>alert를 띄웠는데, alert2에서 지정한 값이 나온다!
alert나 alert2나, 똑같은 실질적 값을 가리키고 있기 때문이다!
<br><br><br><br></p>
<hr>
<h3 id="프로퍼티-초기화-없이-선언">프로퍼티 초기화 없이 선언?</h3>
<br>

<p>View Controller에서, 
viewDidLoad() 바깥에 변수를 선언만하고 초기화하지 않으면 에러가 난다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/f4f48274-48cc-48e9-a5b8-76c82a4feb8e/image.png" alt=""></p>
<p>보통 이렇게 해도 되는데 왤까?
클래스랑 구조체는 좀 다르다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/620b78d5-f9d7-4e28-a809-76a9d80609fc/image.png" alt=""></p>
<p>이렇게 오류가 난다.
클래스의 프로퍼티는 내부적인 값이 있어야 제대로 만들어진다.
명확한 값이 없으면 메모리에 올릴 수 없기 때문이다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/fffa0735-2b7b-4715-8205-9fa665bcfe20/image.png" alt=""></p>
<p>이렇게 할 수는 있지만.. 
nil값이 들어갈 필요가 없는데 굳이 옵셔널로 지정하는 방법은 좋은 방법이 아니다.
<br><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7fd1de85-cf9d-41ad-b182-fa742ae456d0/image.png" alt=""></p>
<p>왜 이건 안 되고</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/812cd233-2fef-4e19-8977-4cb02e8d44b3/image.png" alt=""></p>
<p>이건 될까...
(생각해 보기)</p>
<p><br><br><br><br></p>
<hr>
<h3 id="매개변수는-let이다">매개변수는 let이다</h3>
<br>


<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/cac45d71-ec93-413d-ae7d-caf632bbf732/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c15f90d6-4b54-4e2b-849a-8a8c3956a56a/image.png" alt=""></p>
<p>매개변수는 let이다!!
<br><br><br><br></p>
<hr>
<h3 id="프로퍼티--메서드의-변수상수">프로퍼티 / 메서드의 변수(상수)</h3>
<br>

<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a0cfc85f-23cc-40cb-a4d3-737787a82110/image.png" alt=""></p>
<p>가까운 변수를 찾아 간다.
칙촉이 찍힘
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/f3329607-7503-48b9-b528-abf83c7cd1a4/image.png" alt=""></p>
<p>클래스().프로퍼티
로 접근해서 사용할 수 있다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/5db5efbb-2883-4e03-b5c9-6d3a4861e6dd/image.png" alt=""></p>
<p>혹은 self.프로퍼티 
로도 가능!
<br><br></p>
<p>❔ redeclaration 오류가 안나는 이유가 뭔가요?.?
❕ 박스 기준으로 보아야 한다! (같은 선 상에 있는 게 아니다)
<br><br><br><br></p>
<hr>
<h2 id="memberwise-initializer">Memberwise Initializer</h2>
<br>


<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/0cd20148-21ad-48a4-8e99-0c19112be043/image.png" alt=""></p>
<p>Struct는 init() 함수가 자동으로 생긴다!
이것이 멤버와이즈 초기화구문...!(Memberwise Initializer)
Struct 내부에 써도 되긴 하지만 코드 낭비 시간 낭비,,
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7aec56ac-ad1b-45cc-a9da-0ef8ad10d41c/image.png" alt=""></p>
<p>선언 시 초기화가 된 프로퍼티의 경우
이니셜라이저 함수에서 빼도 된다.
<br><br><br><br></p>
<hr>
<h2 id="storyboard-reference">Storyboard Reference</h2>
<br>

<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/3bb9740c-54f5-4fe9-a4d8-1224a0add8a5/image.png" alt=""></p>
<p>스토리보드 새로 만들기
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/ce74843c-c82d-4e94-9597-4a9387f3f45b/image.png" alt=""></p>
<p>엔트리포인트부터 지정하기.
스토리보드당 하나의 엔트리포인트가 꼭 필요하다!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/38008446-7ae0-41e6-9f56-1f5081545b9d/image.png" alt=""></p>
<p>앱 실행 시 첫 화면으로 지정하고 싶으면
여기서도 바꿔야 한다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/d1e2c0bd-420b-4b77-a255-655046b1ae74/image.png" alt=""></p>
<p>여기서도 바꿔야 한다.
(여기서만 바꿔도 된다..)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/08905285-b755-45c2-b813-c5763e9bddd7/image.png" alt=""></p>
<p>Storyboard Reference를 추가하고
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/f89bffec-2540-4457-bd22-40f697ebacbd/image.png" alt=""></p>
<p>Storyboard 지정!</p>
<p><br><br><br><br></p>
<hr>
<h2 id="라이브러리">라이브러리</h2>
<br>

<p>라이브러리를 사용하면
코드도 줄이고 시간도 줄일 수 있다!
오픈소스 라이선스
<br></p>
<p>초반에는 빨리 출시를 해야 하기 때문에 라이브러리를 쓰지만
사용자가 많아지면서 라이브러리를 덜어낸다
<br><br></p>
<p>라이브러리 설치 방법으로는
CocoaPods, Carthage(라틴어로는 카르타고, 영어로는 카ㄹthㅣg), Swift Package Manager, 수동설치 등이 있다.
<br></p>
<ul>
<li>코코아팟이 끝판왕이라고 한다,,
모든 라이브러리들이 코코아팟을 지원함!
하지만 빌드 속도가 느리다..</li>
</ul>
<ul>
<li>Carthage는 빌드 속도는 CocoaPods에 비해 빠르지만
지원하는 라이브러리 갯수가 많지 않다.</li>
</ul>
<ul>
<li>SwiftPM은 애플에서 지원하는 모듈!
(아래에서 패키지 = 모듈 모아놓은 것 이라고 했는데 패키지 매니저가 모듈..?)
원래는 별도의 기능으로 있었고 설치가 굉장히 까다로웠다고 한다,,
하지만 네이티브가 짱.. 요런 느낌으로 기억하기,, ⭐️
이제 거의 모든 라이브러리들이 지원한다고 한다!</li>
</ul>
<br>

<p>내가 경험했을 때도 코코아팟은 일단 설치부터가 좀.. 말잇못
파일이 커지고 빌드가 굉장히 느려지고..
머지할 때도 문제를 많이 일으켰었다.
반면 SPM은 가볍(?)고 빌드 속도에 영향을 준다는 느낌도 별로 없었고..
머지해서 문제가 생기더라도 그냥 다시 설치하면 되고 설치 속도마저 Pods보다 빨랐다... <del>(대충 나는 SPM이 더 좋다는 말)</del>
<br></p>
<p>수동 설치도 있긴 하다
수동으로 파일 드래그 앤 드랍하는 방법,, 잘 안 씀.
<br><br><br><br></p>
<p>캘린더는
<a href="https://github.com/WenchaoD/FSCalendar">FSCalendar</a>, <a href="https://github.com/patchthecode/JTAppleCalendar">JTAppleCalendar</a>
이 두 가지를 많이 쓴다고 한다.
내가 자주 쓰는 TimeBlocks가 혹시 이 라이브러리들을 쓴 건 아닐까,, 하고 앱 설정에 들어가 봤는데,, 오픈소스 라이선스 부분을 아예 찾지 못했다. 웹사이트에도 안 나와 있는 것 같고,, 
<del>(내가 못 찾는 건가)
(하긴 문의메일도 몇 달 째 답장이 없는디,,)</del>
<br></p>
<p>키보드는
<a href="https://github.com/hackiftekhar/IQKeyboardManager">IQKeyboardManager</a>
모르면 간첩이라고 한다,,
<del>난 간첩이었구나 🥲</del>
<br></p>
<p><a href="https://github.com/vsouza/awesome-ios">awesome-ios</a>
이런 것도 한 번 둘러보면 아주 좋을듯!!?
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/d8b4b222-6889-400c-b64a-09d2522bd61c/image.png" alt=""></p>
<p>Package Dependencies 에서 + 버튼
혹은
File - Add Packages
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/1202c725-3b00-4f6d-a20b-2dbfca0690e4/image.png" alt=""></p>
<p>원하는 라이브러리 주소를 넣고
Dependency Rules 설정하고 설치하면
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e5a415a5-dbf2-4ca9-9fe9-33c6d55ea268/image.png" alt=""></p>
<p>타라~
<br><br><br><br></p>
<p>❔ 라이브러리랑 패키지랑 어떻게 다른가요?.?
❕ 아주 비슷,, 나중에 구분하는 시간 따로 가질 것!
<br><br></p>
<p>찾아 본 결과로는,,</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e03c92dd-d09a-4609-bca3-330b7280d081/image.png" alt=""></p>
<p>패키지는 모듈을 모아놓은 것이고
라이브러리는 패키지들을 모아놓은 것..!
라이브러리가 더 큰 개념이라고 볼 수 있겠다.
<a href="https://dev.to/hamza/framework-vs-library-vs-package-vs-module-the-debate-3jpp">(출처)</a>
<br><br><br><br></p>
<h4 id="textfieldeffects-사용해-보기"><a href="https://github.com/raulriera/TextFieldEffects">TextFieldEffects</a> 사용해 보기</h4>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/4a986d69-def8-40cb-81f4-d4ce7fd292a2/image.png" alt=""></p>
<p>스토리보드에서 텍스트필드 레이아웃 잡고 인스펙터 확인!
<a href="https://github.com/raulriera/TextFieldEffects">TextFieldEffects</a>를 설치했기 때문에 UITextField를 상속받은 클래스들을 볼 수 있다!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a4b7cc9b-26ee-4d03-a3a1-89c03e0a6a79/image.png" alt=""></p>
<p>원하는 클래스 선택하고 나머지는 그대로 두기
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/81182d29-7c12-4467-b787-4ebc5d7ce6aa/image.png" alt=""></p>
<p>이 두 가지 값을 곱해서 폰트 크기가 정해진다
<br><br><br><br></p>
<h4 id="sidemenu-사용해-보기"><a href="https://github.com/jonkykong/SideMenu">SideMenu</a> 사용해 보기</h4>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b87fc112-12d4-441e-8603-1a1f41f1f7d2/image.png" alt=""></p>
<p>먼저 Navigation Controller에 Embed
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/706f01dc-2423-4c22-bd96-da0ab5540d0c/image.png" alt=""></p>
<p>그리고 Navigation Controller의 Class를 
SideMenuNavigationController로 지정한다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/65d98d1e-7a06-456c-bd23-562567728ff0/image.png" alt=""></p>
<p>Present Modally로 해야 한다!
(만든 사람이 그렇게 하라고 했다.)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/320b118a-3287-4df9-bf82-81cda805d41b/image.png" alt=""></p>
<p>바 버튼 추가!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/4b8b3f8a-34b8-483d-9ec0-a534c9248a57/image.png" alt=""></p>
<p>돌려 보면
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/aa3edb84-34fb-47d3-856c-c3e1b5806987/image.gif" alt=""></p>
<p>사이드 메뉴 순식간에 만들기 완성..!
여러 라이브러리들을 잘 활용하면 더 그럴싸(?)한 앱을 더 짧은 시간 안에 만들기에 좋을 것 같다. 
<br><br><br><br></p>
<h4 id="iqkeyboardmanager-사용해-보기"><a href="https://github.com/hackiftekhar/IQKeyboardManager">IQKeyboardManager</a> 사용해 보기</h4>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/68c8667b-2b80-4983-a063-1b2309947200/image.png" alt=""></p>
<p>AppDelegate에서 하는 이유: 모든 곳에서 쓰기 위함
<br><br><br></p>
<p>❔ 다른 라이브러리는 import 하지 않아도 되는 이유가 무엇인가요?
❕ 다른 라이브러리들은 코드 작성 안 했으니까..! (ㄴ(°0°)ㄱ...!!!!!)
스토리보드에서는 내부코드가 있어서 가능했음!
<br><br><br><br></p>
<hr>
<h2 id="소프트웨어-버전-규칙">소프트웨어 버전 규칙</h2>
<br>

<ul>
<li>Major: 가장 크게 달라지는 지점들에 대한 업데이트
기존 버전과 호환이 안 됨
이럴 때 deprecate되는 것들이 많다</li>
<li>Minor: 세세한 기능 올라갈 때</li>
<li>Patch: 버그 수정. 유지보수
<br><br></li>
</ul>
<p>법처럼 항상 이렇게 해야 한다는 건 아니고
이런 형태로 지켜 주는 것이 좋다</p>
<p>만약 라이브러리를 10개 설치하고 하다보면
1개 업데이트 하면 안 맞고 이런 게 생길 수 있다
<br><br><br><br></p>
<hr>
<h2 id="dateformatter">DateFormatter</h2>
<br>

<p>yyyy MM dd hh mm ss 
이런 형태..</p>
<p>Month는 대문자 M
minute은 소문자 m 주의,,</p>
<p>HH는 24시간 표시
hh는 12시간 표시
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b2f91e5e-b5ff-4191-9c05-34ce9404b248/image.png" alt=""></p>
<p>표준시로 나온다!
<br><br><br><br></p>
<hr>
<br>
확인해야 할 부분들
<br><br>

<ul>
<li><input disabled="" type="checkbox"> clipsToBounds와 masksToBounds의 차이..
효과는 똑같은데, 어디에서 호출하는지만 다르다!
clipsToBounds를 바꾸면 masksToBounds도 자동으로 달라진다.
clipsToBounds, shadow, cornerRadius를
Button, Label, Image에 다 해 보기.
다 다르게 나올 것..!</li>
<li><input disabled="" type="checkbox"> 힙은 처음부터 채워지고 스택은 마지막부터 채워진다(?)</li>
<li><input disabled="" type="checkbox"> 프로퍼티 초기화 없이 선언?
<br><br><br><br></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[UIKit] Date Picker]]></title>
            <link>https://velog.io/@cur-ios-ity/UIKit-Date-Picker</link>
            <guid>https://velog.io/@cur-ios-ity/UIKit-Date-Picker</guid>
            <pubDate>Wed, 13 Jul 2022 14:20:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e6761b01-f9c5-4aca-b60f-751c1f697244/image.png" alt=""></p>
<h1 id="date-picker-사용해-보기">Date Picker 사용해 보기</h1>
<p><br><br></p>
<h2 id="preferreddatepickerstyle">preferredDatePickerStyle</h2>
<br>

<p>preferredDatePickerStyle의
automatic, wheels, compact, inline 사용해 보기
<br><br></p>
<h3 id="automatic">automatic</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/ff15278a-1df2-4e7a-87fd-ae2a970af86e/image.gif" alt=""></p>
<p>클릭하면 캘린더가 뜬다.
<br><br></p>
<h3 id="wheels">wheels</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/274854bb-01e2-4711-a1ae-980db907d60d/image.png" alt="">
<br><br></p>
<h3 id="compact">compact</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/03e7801f-2f5a-4052-830f-c751efb7bd5b/image.png" alt=""></p>
<p>클릭하면 automatic과 같이 캘린더가 뜬다.
automatic으로 했을 때 compact로 자동 설정되는 것 같다.
<br><br></p>
<h3 id="inline">inline</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/0a7551d6-f523-4a79-9afc-aa85789496c4/image.png" alt="">
<br><br><br><br></p>
<h4 id="ios-버전에-따라-분기">iOS 버전에 따라 분기</h4>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/0bb8fca2-9692-449d-aff4-09e7b1f02feb/image.png" alt=""></p>
<p>iOS 14.0 이상은 preferredDatePickerStyle을 .inline으로,
iOS 14.0 미만은 .wheels로 처리
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/df1e9af1-9c3a-400d-b4b8-de9be59ba984/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c0225b44-5f35-4d7a-824e-146771741b1f/image.png" alt="">
<br><br><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.13]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.13</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.13</guid>
            <pubDate>Wed, 13 Jul 2022 03:40:31 GMT</pubDate>
            <description><![CDATA[<h2 id="배열-및-삼항연산자">배열 및 삼항연산자</h2>
<br>

<pre><code class="language-swift">// 100개의 요소(값은 모두 0)를 갖는 배열
var array = Array(repeating: 0, count: 100) 
type(of: array)  // Array&lt;Int&gt;.Type

// 1부터 100까지의 요소를 갖는 배열
var array2 = [Int](1...100)
// var array2: [Int]? = [Int](1...100)  // 옵셔널로 만들고 싶을 때
type(of: array2)  // Optional&lt;Array&lt;Int&gt;&gt;.Type


if array2?.count == 0 {  // nil이 있을 수 있기 때문에 옵셔널 체이닝
    print(&quot;값이 없습니다&quot;)
} else {
    print(array2?.count)  // &quot;Optional(100)\n&quot;
}


if array2 == nil {  // nil이 있을 수 있기 때문에 옵셔널 체이닝
    print(&quot;값이 없습니다&quot;)
} else {
    print(&quot;값이 있습니다&quot;)
}

// 위 다섯 줄을 한 번에
// 삼항연산자 &gt;&gt; 조건 ? ㅇㅇ : ㄴㄴ
let result = array2 == nil ? &quot;값이 없습니다&quot; : &quot;값이 있습니다&quot;

// 물음표 앞에도 함수가 올 수 있다. 단, Bool 타입을 반환하는 함수여야 한다.</code></pre>
<p><br><br><br><br></p>
<hr>
<h2 id="return">return</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/59885e09-e111-4bdc-b9c0-fe16ff3b5a6e/image.png" alt=""></p>
<p>조건문 안에서 다 처리가 되면 이런 워닝이 뜬다
노란색 워닝은 에러가 아니니까 넘어가는 사람들이 있는데
그게 점점 쌓인다,,
해결하고 넘어가기!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/154a5fef-ffb0-4a0a-b5fb-d20e65ba5ca1/image.png" alt=""></p>
<p>조건문 안에서 모든 경우가 처리되면
조건문 밖에서 리턴값을 지정해 줄 필요가 없다
<br><br></p>
<pre><code class="language-swift">// Swift 5.1 부터 return 생략 가능
@discardableResult  // 반환값을 선택적으로 사용할 때
func randomNumber() -&gt; Double {
    // 연산해서 배경 컬러 변경 또는 텍스트필드에 텍스트를 교체, 키보드 내리는 기능 등
    Double.random(in: 1...100)  // 한 줄로 리턴이면 가능하지만 잘 안 쓴다
    // 한 줄짜리 함수가 별로 없기도 하고
    // 가독성적인 측면에서 그냥 쓰는 게 낫다
}</code></pre>
<p><br><br><br><br></p>
<hr>
<h2 id="매개변수의-기본값">매개변수의 기본값</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/530fd2d7-3e30-4dbe-838a-c337484747a1/image.png" alt=""></p>
<p>함수에서 매개변수의 기본값을 정해둘 수 있다
그러면 함수 호출 시,
기본값을 사용하는 함수와
매개변수의 값을 변경할 수 있는 함수들이 뜬다
<br><br></p>
<pre><code class="language-swift">print(&quot;안녕하세요&quot;, separator: &quot;123&quot;, terminator: &quot;456&quot;)  // 안녕하세요456
print(&quot;안녕히가세요&quot;, separator: &quot;123&quot;, terminator: &quot;456&quot;)  // 안녕히가세요456</code></pre>
<p>print() 함수도 매개변수 값을 바꿔서 호출하는 것이 가능하다
<br><br><br><br></p>
<hr>
<h2 id="enumeration---열거형">Enumeration - 열거형</h2>
<pre><code class="language-swift">enum Gender: String {  // 상속 X
    case male = &quot;남성&quot;
    case female = &quot;여성&quot;
    case none
}


var gender: Gender = Gender.none
gender.rawValue  // 알파벳 그대로 &quot;none&quot;  // rawValue는 항상 존재한다


// Switch 구문 활용 - 경우의 수에 대한 대응이 더 안정적이다
switch gender {
case .male: print(&quot;남성입니다&quot;)
case .female: print(&quot;여성입니다&quot;)
case .none: print(&quot;아직 선택하지 않았습니다&quot;)
//default:  // 100%에 대해 대응할 경우 default 사용할 필요 없음
//    print(&quot;오류입니다&quot;)
}</code></pre>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/5e79bf81-fcd8-4b5a-9b01-e31c54f04413/image.png" alt=""></p>
<p>100%에 대해 대응할 경우 default 사용할 필요 없음
<br><br></p>
<p>❔ enum으로 하니까 코드가 더 길어지는 것 같아요
❕지금은 코드가 짧아서 비례적으로 봤을 때 더 길어보이지만, 나중에 코드가 길어지면 가독성 측면에서도 더 낫다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/357edebe-6570-45f1-8d59-b046f510b83a/image.png" alt=""></p>
<p>보통 Raw Value(원시값)의 타입은 Int, String 정도다
<br><br></p>
<pre><code class="language-swift">enum HTTPCode: Int {
    case OK  // 0
    case NO_PAGE  // 1
    case NOT_FOUND = 404
    case SERVER_ERROR  // 405

    func showStatus() -&gt; String{
        switch self {
        case .OK: return &quot;정상입니다&quot;
        case .SERVER_ERROR: return &quot;긴급점검&quot;
        case .NOT_FOUND: return &quot;잘못된 문제&quot;
        case .NO_PAGE: return &quot;페이지를 찾을 수 없음&quot;
        }
    }
}

var networkStatus: HTTPCode = .SERVER_ERROR


let resultStatus = networkStatus.showStatus()
print(resultStatus)  // 긴급점검</code></pre>
<p>열거형 안에 함수를 넣어서 사용이 가능하다
<br><br><br><br></p>
<hr>
<h2 id="xcode-tip">Xcode Tip</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/9318f540-7624-405e-96cb-cab65666cd11/image.png" alt=""></p>
<p>완벽하게 파일을 지우고 싶으면 Move to Trash
그래야 나중에 같은 이름으로 새 파일을 만들어도 문제가 없다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/5a257923-cdfb-44bd-8064-a271332de286/image.png" alt=""></p>
<p>그대로 복제해서 쓰겠다는 의미
항상 이 상태로 파일을 추가해야 한다</p>
<p>references로 넣게 되면
xcode 프로젝트 안에 있는 것처럼 보이지만
원래 파일 경로로 들어 가게 된다
그러면 파인더에서 파일 삭제하면 엑코에서도 못 쓰게 된다
<br><br><br><br></p>
<hr>
<h2 id="class-struct---클래스-구조체">Class, Struct - 클래스, 구조체</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6bfc4118-3ec1-41ac-b071-792122030c1a/image.png" alt=""></p>
<p>super.viewDidLoad() 없더라도 당장은 괜찮아 보이지만
내부적으로 어떤 문제가 생길지 모르기 때문에
꼭 super.ViewDidLoad()를 해 주어야 한다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b76326fa-b5df-48bc-9d28-1f884cacdcfc/image.png" alt="">
struct는 상속이 안된다</p>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a4f97e78-6fd5-4327-9bfc-83aab0a4b9ce/image.png" alt="">
S - Struct 
상속이 안 되게 만들어져 있다
<br><br></p>
<p>UIKit은 클래스 
iOS 에서는 클래스의 인스턴스를 객체라고 한다
<br><br></p>
<p>Struct - 값 타입
Class - 참조 타입
클래스의 실질적인 데이터는 다른 공간에 저장이 되어 있다
<br><br></p>
<pre><code class="language-swift">// MARK: - 구조체: 값 타입

var nickname = &quot;고래밥&quot;
var subNickname = nickname
subNickname = &quot;칙촉&quot;

print(nickname)  // 고래밥
print(subNickname)  // 칙촉</code></pre>
<br>

<pre><code class="language-swift">// MARK: - 클래스: 참조 타입
class Monster {  // SuperClass이자 BaseClass(어떤 클래스도 상속받지 않기 때문)
    var clothes = &quot;Orange + Christmas&quot;
    var speed = 5
    var power = 20
    var expoint: Double = 500

    func attack() {
        print(&quot;공격!!!&quot;)
    }
}


var miniMonster = Monster()

var bossMonster = miniMonster
bossMonster.power = 5000

print(miniMonster.power)  // 5000  // 20이 아니다
print(bossMonster.power)  // 5000



class BossMonster: Monster {  // Subclass
    var levelLimit = 500

    func bossAttack() {
        print(&quot;스페셜 공격&quot;)
    }

    // 재정의
    override func attack() {
        super.attack()  // SuperClass의 함수 호출
        print(&quot;오버라이드 공격!&quot;)
    }
}

var finalBoss = BossMonster()
finalBoss.bossAttack()  // 스페셜 공격
finalBoss.levelLimit    // 500
finalBoss.speed          // 5
finalBoss.clothes         //  &quot;Orange + Christmas&quot;
finalBoss.attack() 
// 공격!!!                  // SuperClass의 함수 호출
// 오버라이드 공격!          // 재정의한 함수 호출</code></pre>
<p><br><br><br><br></p>
<hr>
<p>❔ 반환값이 있는 함수에서는 if랑 else if에서 모든 처리가 다 되어도 else가 없으면 missing return 오류가 뜨는데 else 가 필수인가요?.?
❕ 우리 입장에서는 모든 경우의 수가 처리되는 것처럼 보여도
코드적인 문법에서는 아니기 때문에 else 처리 </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.08]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.08</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.08</guid>
            <pubDate>Fri, 08 Jul 2022 10:33:06 GMT</pubDate>
            <description><![CDATA[<p>VCS: Version Control System</p>
<h2 id="git-만들기">Git 만들기</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/4fc03b34-50f9-4c85-bf80-c0371c65d5d0/image.png" alt=""></p>
<p>Preferences - Accounts -  (+)버튼 -  깃헙
깃헙계정 등록
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/5c4ec0b9-0eaa-4951-aca6-b564e862601f/image.png" alt=""></p>
<p>리포지토리 생성 - 기기 내에서 관리된다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6107fb96-a4ba-4384-90d3-c55dfea33953/image.png" alt=""></p>
<p>커밋해서 확인 가능
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/096b47aa-3887-4bab-a378-770a4191a9b3/image.png" alt=""></p>
<p>Remote로 올리고 Push하면 다른 데서 다운받을 수 있다
<br><br></p>
<p>지금은 학습하는 단계니까
커밋 메시지는 한글로 해도 되고 아무거나 해도 되지만</p>
<p>포트폴리오 할 때는 커밋 본다
얼마나 일관적인 기준으로 하는지 등을 본다..</p>
<p>이정도 하는데 얼마나 걸렸구나,
텍스트필드 작업했다고 커밋하면 해당 부분을 보거나 한다.</p>
<p>커밋은 작은 단위
웹사이트에 올리고 싶으면 푸시
<br><br></p>
<p>working directory는 커밋도 안 된 상태
staging area에서 커밋할 파일 고르고
커밋하면 local repository에 기록된다
푸시하면 remote repository에 기록된다</p>
<p>커밋+푸시를 한꺼번에 하고 싶으면
커밋할 때 밑에 push to... 를 체크하면 지금까지 했던 것들 모두 한꺼번에 푸시
<br><br></p>
<p>깃 리포지토리는 프로젝트 단위로 한다!
그게 깃의 목적(?)이다.
<br><br><br><br></p>
<hr>
<h2 id="auto-layout">Auto Layout</h2>
<p>뷰는 화면 왼쪽 위부터 차곡차곡 쌓인다</p>
<h3 id="constraints">Constraints</h3>
<ol>
<li>디바이스와의 간격</li>
<li>뷰와 뷰 사이의 간격</li>
<li>높이/너비 같은 요소 - 뷰 객체가 많아질 수록 어려워짐</li>
</ol>
<ul>
<li>여백과 객체의 너비 둘 다 잡으면 충돌이 난다
<br><br></li>
</ul>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/1f14e1f3-4ce0-404f-b04a-8936ccafe54b/image.png" alt=""></p>
<p>프리뷰 볼 수 있다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b8d14438-8237-424c-a1e3-ef35c9a5c453/image.png" alt=""></p>
<p>제약조건 추가임
수정이 아니다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/54a98921-e794-41bd-846c-d18225686879/image.png" alt=""></p>
<p>추가되어 오류가 난 모습
파란 실선은 잘 되어 있다는 뜻이다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/bbe36a12-698d-4667-9631-0d9c9a06a33e/image.png" alt=""></p>
<p>선택한 뷰의 모든 constraints 지우기
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/72810332-b49d-47be-888d-630389d4dc68/image.png" alt=""></p>
<p>화면 가운데 정렬
<br><br></p>
<ul>
<li>뷰당 4개의 제약조건을 갖게 된다</li>
</ul>
<p>마우스로 옮기고 update constraints 도 가능
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7424f8e3-72bf-4aa0-9e99-f1e0880763a4/image.png" alt=""></p>
<p>옮겨져서 주황색 선이 뜨면 
설정한 constraints에 맞게 다시 이동하는 방법은
Update Frame 버튼 누르기
⌥⌘=
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/5fd8f253-bcc7-4ad7-b771-da12857a40ca/image.png" alt=""></p>
<p>Constrain to margins
애플이 제안하는 최소 여백
3주차 쯤에 할 것
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e64204de-89c1-4d82-99d9-ddecd1b56b8c/image.png" alt=""></p>
<p>프리뷰 위치 옮기기
<br><br></p>
<p>❔ 보통 constraints를 막 39 41 이런 숫자보다 35 40 이런 식으로 깨끗한(?) 숫자로 하는 게 더 좋은가?
❕ 디자이너들이 가이드 줄 건데 HIG 같은 것 때문에 그렇다 보통 4의 배수로 한다.
<del>(이 답변을 들은 이후 4의 배수인지 확인하는 습관(?)이 생김,, + 디자인 팀들이 한쪽은 74 한쪽은 76 이런 식으로 줬던 트라우마(?)가 생각남,,)</del>
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/141f39a3-4074-46cf-af6d-d058ad523816/image.png" alt=""></p>
<p>Constraints는 
큰쪽에서 작은 쪽으로 잡고
위에서 아래 혹은 아래에서 위로 한 방향으로 잡기
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c90d9fe5-49c6-4e02-b4b5-26805de9ad0c/image.png" alt=""></p>
<p>가장 가까이 있는 뷰 기준으로 숫자가 나온다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2c6b3c35-435d-4ad3-aa19-0e50b0372868/image.png" alt=""></p>
<p>겹치면 화면기준으로 나온다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e78a96e0-315a-4277-bf71-f5de39096cda/image.png" alt=""></p>
<p>좌우여백
위 여백 준 것이다
➕ 높이까지 해 줘야 함
그래서 4가지
욕 아님
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/ab9a29c7-e51b-4650-8ba6-11a14c0289a2/image.png" alt=""></p>
<p>Aspect Ratio
비율
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/52d43b03-5906-4b12-a74f-e42579f2e3b5/image.png" alt=""></p>
<p>한 방향으로 잡아가는 것이 좋기 때문에 여기서는 가장 오른쪽부터 한다 </p>
<p>HIG에서는 버튼 간격이 최소 8 정도는 주는 걸 권장한다
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2238bfd6-78f0-4001-9e97-803fa97ed90a/image.png" alt=""></p>
<p>이하 이상 설정도 가능하다
<br><br><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.07]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.07</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.07</guid>
            <pubDate>Thu, 07 Jul 2022 04:16:32 GMT</pubDate>
            <description><![CDATA[<p>씬이랑 클래스파일이랑 연결시킨 후 
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/b678afe5-065e-4d8c-b8ac-cf8db8d8d7c0/image.png" alt=""></p>
<p>누르고 Assistant 누르면 연결화면이 그대로 뜬다
⌃⌥⌘⏎</p>
<p>보조창기능이라고 부른다
<br><br></p>
<p>거터에서 숫자 클릭 - breakpoint
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/89796517-f483-4bd0-add3-66f4cc91759e/image.png" alt=""></p>
<p>누를 때마다 브레이크포인트 하나씩 넘어간다
초반에는 안 쓰는 것이 권장된다!
네비게이터에서도 켜고 끄거나 지울 수 있다
네비게이터에서 파일명을 누르고 지우면 모든 브레이크를 지울 수 있다
브레이크포인트 오른쪽 마우스 클릭 - edit을 눌러서 조건을 주거나 할 수도 있다
(특정 조건을 걸어서 멈추게 한다)
<br><br></p>
<p>Swift 파일 생성: 빈 파일 생성
Cocoa Touch Class 파일 생성: 씬에 맞는 템플릿 파일 생성</p>
<p>Cocoa Touch
Media
Core Service
Core OS</p>
<p>개발자에게 가장 친숙한 박스는 Cocoa Touch
UIKit 박스 안에 Foundation 박스가 들어 있다
(UIKit이 Foundation을 상속 받는 건지? 아닌 것 같은데, 그냥 UIKit을 import하면 Foundation도 import 되도록 설정되었다고 봐도 되는 건지?)</p>
<p>➕ UIKit을 import하면 Foundation도 import 되도록 설정되었다고 봐야 한다! (22.07.14)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7ed31db0-6612-4601-bbe4-408076db128f/image.png" alt="">
command shift 0 (⌘⇧0)
Xcode에서 공식문서 바로 열어볼 수 있다
<br><br></p>
<p>레이블 lines 0으로 하면 무한대 줄 표현이 가능하다
이 말은, 
정해져 있는 영역 안에서 최대치의 줄 표현이 가능하다
autoshrink 에서 minimum font size를 지정해서 사용할 수 있다
scale은 비율이다
설정 포인트에서 몇프로까지 줄일 것이냐의 의미다. 0.8이면 80%까지 줄이는 것</p>
<p>텍스트필드도 Min Font Size 설정이 가능하다</p>
<p>서비스적으로는 더보기로 늘려 주는 게 낫다!
<br><br></p>
<p>Default 색상은 무슨 색일까?
배경을 Default로 지정하고</p>
<pre><code>print(view.backgroundColor)</code></pre><p>를 찍어 보면 nil이 찍힌다.
배경색이라고 하는 자체가 없는 것이다.
눈으로 봤을 때는 투명한 상태</p>
<p>제스처 인식도 되지 않는다.
제스처를 인식하려면 영역이 있어야 하는데
영역이 없는 것으로 인지되기 때문이다.
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/694a58ce-d8fa-4a80-88df-8a427b2e8639/image.png" alt="">
.clear로 배경을 투명하게 만들 수 있다
.default는 안 된다.
코드상으로 명시해 줄 때는 직관적인 것이 좋기 때문에 .clear 권장!</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c8931ff8-4173-49ea-9b6f-e2a857ddb76b/image.png" alt=""></p>
<p>.default로는 탭 제스처 인식이 안 되지만
.clear로는 탭 제스처 인식이 가능하다
<br><br></p>
<hr>
<br>

<h2 id="optional">Optional</h2>
<br>

<p>UInt: Unsigned Int 양수만</p>
<p>var name: String --- nil 불가(스트링 타입)
var name: String? --- nil 가능 → 문제 생길 수 있으니 주의하라는 뜻(옵셔널 스트링 타입)
<br></p>
<h3 id="옵셔널-타입-대처">옵셔널 타입 대처</h3>
<p>대처 안 했을 때: 앱이 꺼진다. 런타임 에러 - 앱 실행 중 꺼지는 것을 런타임 에러라고 부른다
(빌드 안되는 것은 컴파일 에러) (컴파일은 번역같은 것)</p>
<p>대처 방법 3가지 
강제해제 연산자 느낌표 ( ! )
옵셔널 바인딩 - if let 키워드와 guard 구문 사용
옵셔널 체이닝
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2ab0f616-67ba-4298-98d1-a83db2437fc1/image.png" alt=""></p>
<p>Int 변환할 때 실패할 수 있는 가능성 때문에 안전하게 하기 위해 Optional()
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/cbdb496e-1deb-4eba-91a4-0954cc62dc99/image.png" alt=""></p>
<p>100% 문제가 없을 때 강제 해제 연산자 ! 사용
<br><br></p>
<blockquote>
<p>느낌표 위치는 Xcode가 알려주긴 할 것❕
시간 너무 많이 쓰지 않기❕</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.06 | Mission]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.06-Mission</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.06-Mission</guid>
            <pubDate>Thu, 07 Jul 2022 04:15:29 GMT</pubDate>
            <description><![CDATA[<p>앞선 과제에서 회원가입 버튼 클릭 시 조건을 판단하는 기능 구현을 시도했다.</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7d100c5e-0888-4422-ac4a-74d45cf32710/image.png" alt=""></p>
<p>사용자가 회원가입 버튼을 누르면, 사용자가 텍스트필드에 입력한 이메일과 비밀번호를 확인하는 코드다.
TextField에 아무것도 적지 않아도 강제 언랩핑 코드에서 오류가 나지 않아, 텍스트필드의 text에 대해 찾아보게 되었다.
<br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/f982dfa7-d118-4b35-8202-d9fb5194b3b9/image.png" alt=""></p>
<p>텍스트필드의 text는 Optional String이다.
<br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/cf5d7062-9890-49aa-8a99-15b75dc69103/image.png" alt=""></p>
<p>심지어 여기에 나와 있다. default 값이 nil이 아니라 @&quot;&quot; 라고....
(@는 Objective-C semantics인데, 리터럴 스트링은 앞에 @를 붙여야 한다고 한다.)
<br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/3bc1f511-608c-4a44-9c30-a41b11513c93/image.png" alt=""></p>
<p>하지만 아무것도 입력하지 않을 경우에도 텍스트필드의 text 값은 nil이 아니라 &quot;&quot;이다.
(nil과 &quot;&quot;은 다르다)
<br><br><br></p>
<pre><code>passwordTextField.text = nil
print(&quot;passwordTextField.text: \(passwordTextField.text)&quot;)</code></pre><p>심지어 위 코드의 결과는
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/c04746ce-c28e-476c-97d6-189307bd6585/image.png" alt=""></p>
<p>이렇다 ㅎ....
nil이라고 아예 지정을 해 줘도 nil이 아닌 Optional(&quot;&quot;)를 갖는 것이다.</p>
<p>사용자가 nil을 텍스트필드에 지정할 수는 없긴 하다.
<br><br><br><br></p>
<p>어쨌든, </p>
<p>아무것도 입력하지 않아도 nil이 아닌데, 왜 텍스트필드의 text는 Optional String일까?
<br><br><br><br></p>
<p>답(?)은 이렇다.
Objective-C에서는 사용자가 변수에 nil을 할당하는 걸 막을 방법이 없었고, 결과적으로 text가 Optional이 될 수 밖에 없었다고 한다.</p>
<p>오래된 API들은 일일이 수정(?)되어 왔고, 그건 불필요한 옵셔널들을 없애는 게 주요 목적(?)이었는데, 이것도 제거가 됐어야 했는데 안 됐다며.. 버그라고 보는 개발자(?)들도 꽤 있는 것 같다.
<br><br></p>
<p>나중에 텍스트필드로 받은 값들을 어떻게 변형하느냐에 따라 달라질 수도 있겠지만,
일단은 사용자가 아무 값도 입력을 안해도 nil이 아니니 강제 언랩핑을 해도 된다고 봐도 될 것 같다.
<br><br><br><br></p>
<p>(출처)
<a href="https://stackoverflow.com/questions/42861115/why-is-uitextfield-text-an-optional">갓택오버플로우0</a>
<a href="https://stackoverflow.com/questions/53572568/force-unwrapping-uitextfield-text-not-crash-but-uilabel-text-crash">갓택오버플로우1</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.06]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.06</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.06</guid>
            <pubDate>Wed, 06 Jul 2022 07:17:14 GMT</pubDate>
            <description><![CDATA[<p>iOS 13부터 iPadOS가 등장!
iOS 12.4로 낮추면 오류 뜨면서 빌드가 안 됨
<br><br></p>
<p>앱 사용하고 있다: 폰 화면에 띄워진 것
이런 상태를 5가지로 나눠놓은 게 앱의 생명 주기.</p>
<p>앱 시작되기 전 상태: not running - 메모리상에 없는 상태
앱 실행되고 있는 상태(활성화): active - 최대 1 개일 수 밖에 없다
inactive: 전화나 알람이 울려서 화면 전체를 가려 버릴 때
background: 화면에는 보이지 않지만 약간의 코드가 돌아가는 상태
suspend: 열려있는 앱 목록에서 앱을 위로 민 상태
suspend상태는 일정 시간이 지나면 not running으로 돌아간다
<br></p>
<p>AppDelegate파일: 앱의 생명주기 관리
SceneDelegate: iOS 13부터!
아이패드는 앱 하나를 여러개로 띄울 수 있다. 그래서 active한 앱은 하나여야 한다는 룰이 깨져버렸고, 3 개도 active할 수 있게 됨</p>
<p>그래서 scene이라는 개념이 나오게 됨</p>
<p>(pip는 active상태라고 하지는 않음)
→ 그럼 어떤 상태인지?
<br><br></p>
<p>@available @는 attribute 라는 뜻
@available(iOS 13.0, *) 오른쪽 클릭해서 create snippet
여기서 completion까지 넣으면, 약간 아이폰/맥 키보드-단축키 처럼 사용할 수 있다</p>
<p>#와 @의 차이
#: 플랫폼이 다를 때, 다르게 처리하기 위함
@: 함수, 클래스, 구조체, 프로토콜 앞에 붙어서 OS 및 버전을 제한
콜을 플랫폼 별로
<a href="https://wonyoung2.tistory.com/751">출처 0</a>  /  <a href="https://kor45cw.tistory.com/305">출처 1</a>
<br><br></p>
<p>백그라운드 컬러에서 iOS 13 다크모드 생기면서
컬러 네이밍은 똑같은데 system이라는 말을 붙여서 두 가지 컬러값을 가진 컬러들이 생겼다.
HIG를 보면 컬러셋들이 어떻게 정리되어있는지 볼 수 있다.</p>
<p><a href="https://developer.apple.com/design/resources/">디자인 리소스</a>를 다운 받을 수 있다</p>
<p>에셋 컬러셋에서
any, light, dark를 선택하면
iOS 13.0 이전 버전에서 any 적용 가능</p>
<p>다크모드 아예 안 쓸 거라고 프로젝트에서 명시가 가능
info.plist에서 Apperance에 Light라고 적으면 된다. 
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/0711bebe-ba5d-476d-bb0b-29fff9a6b7f6/image.png" alt="">
(대문자 주의)
Appearance대신 UserInterfaceStyle이라고 적으라는 글들도 있을 텐데 모두 예전 것들임!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/3106b734-2897-43d3-b074-266b1e365f3b/image.png" alt=""></p>
<p>아이폰은 인디케이터 바가 노치에 묻히기 때문에
upside down은 아이패드에서만 가능
portrait 체크해도 회전이 된다.. 빌드세팅에서 또 수정해야 한다 🥲</p>
<p><em>빌드세팅 다 알 필요 없고
왜 있는지 알면 되고 시간이 지나가면서 배우게 되면 됨
general이랑 info에서 바꾼 내용들이 빌드세팅에서까지 바뀌어야 잘 바뀐 것이다!!</em></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/35f622b7-fff9-450b-b270-a46b0a5a92c8/image.png" alt=""></p>
<p>여기에서도 해 줘야 한다
그러면 회전해도 고정되어있음!
버그라고 단정짓기는 어렵다....!
<br><br></p>
<p>프로젝트 하나에 타겟 여러 개 만들 수 있다
프로젝트 설정값이 타겟에 자동으로 상속된다
<br><br></p>
<p>UIWindow는 눈에 보이는 아이는 아니고
어떤 뷰컨을 보여줄지 관리하는 아이다
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/bab83821-fdf3-4268-b615-06710c00de4b/image.png" alt=""></p>
<p>UIWindow의 역할 찾아보기
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e092af2f-4828-4e8b-8c00-810c2daecf4e/image.png" alt=""></p>
<p>iOS 13 부터  SceneDelegate로 UIWindow가 넘어온다
12.4도 UIWindow가 쓰이는데 AppDelegate에 있다
<br><br></p>
<p>디자인 요소 수정: @IBOutlet
동작 요소 수정: @IBAction
IB는 Interface Builder의 약자~! (체감상 5번째 적는 듯)
<br><br></p>
<p>Will, Did 등 찾아보기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.05 | Assignment]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.05-Assignment</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.05-Assignment</guid>
            <pubDate>Tue, 05 Jul 2022 13:32:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e6e938be-cab5-45b8-9ce7-0c6f5b150c56/image.png" alt="">
<a href="https://velog.io/@cur-ios-ity/iOS-Storyboard-%EC%82%AC%EC%9A%A9%ED%95%B4-%EB%B3%B4%EA%B8%B0">저번에 만들었던</a> 넷플릭스 화면에서
뷰 객체를 @IBOutlet으로 선언한 뒤 코드를 통해 UI 수정하기!</p>
<p>그 중에서 하단의 이미지 뷰 3 개의 테두리 색상과 모서리 둥글기 조절이 있었는데..
<br></p>
<p>저번에는 하단의 이미지뷰 3 개를 
<em>Button의 Corner Style을 Capsule로 지정하고, 가로 세로 비율을 1:1 로 맞춰 원형으로 만든 후 이미지를 넣고 Stroke 설정으로 구현</em>
했다.</p>
<p>이것을 코드로 바꾸는 과정에서 겪었던 일(?)을 적어 보려 한다.
<br><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/c118f854-9198-4961-8ba6-e4e0366b79eb/image.png" alt="">일단 이미지뷰의 cornerRadius를 이미지 뷰의 절반으로 지정해 주어 원형으로 만들고(반지름 값으로 가질 수 있게!)
테두리 굵기도 5초만에(체감 상) 만들었는데.. 
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/20dcf9c4-1c72-430d-9de8-8047757c4a77/image.png" alt="">이 코드들이 도저히 되지를 않았다.<br>
사실 에셋에 컬러를 넣고 Color Extension을 만들어서 사용하면 가장 깔끔하고 쉬운 방법인데 아직 그 단계까지 수업이 나가지 않았기도 하고 그냥 뷰 컨트롤러에서 저렇게 원시적인(?) 방법으로도 해 보고 싶어서 일부러 해 봤다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/15e46fee-55b1-4244-9287-7c62673eadd9/image.png" alt="">자꾸만 하얗게 나오는 나의 테두리들 🥲🥲
(마지막 사진은 borderColor를 지정하지 않아 검정색이다)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2edd6a18-cc38-4eed-8eda-f6746e6b1a68/image.png" alt="">일단 원하는 컬러를 디지털 컬러 측정기로 찾고..(맥 빌트인 앱이다)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b6049e79-362b-4ee3-8238-36ad13ca3667/image.png" alt="">borderColor가 CGColor이기 때문에 일부러 CGColor로 지정까지 해 주었는데.... 결과는 흰색..
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/27d168f7-95b2-4725-bc47-30fe9ace0e72/image.png" alt=""></p>
<p>스토리보드에서 사용했던 Custom을 다시 클릭해서 코드로 저 네모 부분을 끌어오면 너무 예쁘게도 컬러가 들어온다.. 
( + Assets - Color Set에 있는 Color Panel에서도 끌어올 수 있는데, 이 방법이 더 나은 것 같다 )
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/32047941-4b7d-4ce7-8dab-b703c978fc8a/image.png" alt=""></p>
<p>성공적으로 나오는 테두리 컬러들..!!! 
하지만 코드로 되지 않아 찝찝했다
<br><br></p>
<p>서치서치,,,
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/1dc77677-d438-4e98-b494-a2885906a5c8/image.png" alt=""></p>
<p>아항...!!!! 0부터 1 사이의 값을 지정해 주어야 하는데 내가 준 값들은 100이 넘기도 할 정도로 큰 숫자들이라 흰색으로만 나왔구나,, 
<a href="https://stackoverflow.com/questions/42900042/wrong-color-when-convert-uicolor-to-cgcolor">(원문)</a>
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/874b000c-61a0-4b33-927f-a5f4e2a7e57c/image.png" alt=""></p>
<p>다양한 방법으로 지정해 주기</p>
<blockquote>
<p>❕borderColor는 CGColor이므로 UIColor로 하더라도 .cgColor를 통해 CGColor로 바꿔 주어야 한다.</p>
</blockquote>
<p><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7c7c4ba3-170c-4e51-b1db-905c256722ed/image.png" alt=""></p>
<p>컬러가 아주 잘 나오는 것을 확인할 수 있다 :)
<br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.05]]></title>
            <link>https://velog.io/@cur-ios-ity/7vtq9z3l</link>
            <guid>https://velog.io/@cur-ios-ity/7vtq9z3l</guid>
            <pubDate>Tue, 05 Jul 2022 09:10:35 GMT</pubDate>
            <description><![CDATA[<h2 id="✅-checklist">✅ Checklist</h2>
<ol>
<li>UIKit</li>
<li>UIViewController</li>
<li>UIView</li>
<li>@IBOutlet</li>
<li>@IBAction</li>
</ol>
<hr>
<h2 id="1-uikit">1. UIKit</h2>
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/06014325-2b76-46de-980c-91c42a69c024/image.png" width=600>
<br>

<p>iOS, iPadOS, Mac Catalyst, tvOS, watchOS 앱을 만들 때 필요한 User Interface 도구 프레임워크다.</p>
<p>인터페이스를 위한 윈도우와 뷰 아키텍쳐, 사용자의 인풋을 전달하는 이벤트 핸들링 인프라스트럭쳐 등을 제공하며, 사용자와 시스템, 그리고 우리의 앱! 사이의 인터랙션을 관리할 수 있도록 해 준다 :)</p>
<p>iOS 앱 제작에서 UIKit 혹은 SwiftUI는 꼭 필요하다! 화면이 있어야 하니까..!!
<br>
<a href="https://developer.apple.com/documentation/uikit">→ UIKit 보러 가기</a>
<br><br></p>
<hr>
<br>

<h2 id="2-uiviewcontroller">2. UIViewController</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/0d88a6b4-e89e-4020-818c-d8a6c2d68ab3/image.png" alt=""></p>
<p>UIViewController는 뷰를 관리하는 객체다! UIResponder를 상속받는다.
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6161ada0-45f0-491c-b008-e72024687325/image.png" alt=""></p>
<p>UIResponder는 이벤트에 반응하고 이벤트를 다루는 추상적 인터페이스라고 한다 :)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/df162095-948d-4f40-855e-0fa60700acd8/image.png" alt=""></p>
<p>우리가 흔히 뷰컨이라고 부르는 뷰 컨트롤러는 쉽게 말하자면 요런 화면 하나다! </p>
<p>그리고 이 View Controller는 UIViewController를 상속받아 만들어지게 된다 :)</p>
<p>그냥 UIViewController를 사용해도 되지만,</p>
<p>UITabBarController, UINavigationController, UITableViewController, UICollectionViewController 등</p>
<p>목적에 따라 나눠 지기도 한다!</p>
<p>스토리보드만으로도 화면을 만들 수 있지만, 굉장히 제한적이고 앱의 동작이나 기능 등을 구현하려면 코드로 해야 한다.</p>
<p>이 때 우리는 View Controller 파일을 만들어서 구현을 하게 된다~!
<br>
<a href="https://developer.apple.com/documentation/uikit/uiviewcontroller">→ UIViewController 보러 가기</a>
<br><br></p>
<hr>
<p><br><br></p>
<h2 id="3-uiview">3. UIView</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/81f472f7-a5a4-4840-86ed-436394c5b8f6/image.png" alt=""></p>
<p>화면에서 직사각형 영역의 컨텐트를 관리하는 객체..</p>
<p>UIView도 UIResponder를 상속받기 때문에 터치 같은 사용자의 이벤트를 다룰 수 있다.
<br><br></p>
<p>상속이라구....?
좀 더 이해하기 쉽게 적어 보자면,</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/84ace438-2247-4417-b3d1-960d2e72835a/image.png" alt=""></p>
<p>비어있는 UIView도 만들 수 있지만, 이런 화면에서 보이는 UIImageView, UIButton, UILabel 등은 모두 UIView를 상속받는다.</p>
<p>이게 바로 저런 요소 하나 하나를 뷰라고 부를 수 있는 이유다(?)!</p>
<p><br><br>
또 예를 들어</p>
<p>UILabel과 UIButton은 둘 다 UIView를 상속받기 때문에, UIView의 layer 속성에 dot syntax로 접근이 가능하다!</p>
<pre><code class="language-swift">label.layer.cornerRadius = 10
button.layer.cornerRadius = 10</code></pre>
<p><br><br></p>
<p>하지만 텍스트나 텍스트 컬러의 경우,</p>
<p>UILabel와 UIButton의 속성이 다르기 때문에 서로 다른 방식으로 접근해서 변경해야 한다.</p>
<pre><code class="language-swift">label.text = &quot;레이블&quot;
button.setTitle(&quot;버튼&quot;, for: .normal)

label.textColor = .red
button.setTitleColor(.red, for: .highlighted)

label.backgroundColor = UIColor.yellow
button.backgroundColor = .yellow
// backgroundColor가 UIColor를 상속받기 때문에, 위처럼 UIColor를 생략할 수도 있다</code></pre>
<p><br><br></p>
<blockquote>
<p>버튼은 사용자의 이벤트를 받는 것이 가능한 객체다!  
UIButton이 UIView를 상속받는다고 위에 적었는데,<br>UIButton이 UIControl을 상속받고, 그 UIControl이 UIView를 상속받는 형태다.<br>(UIView &gt; UIControl &gt; UIButton의 순서대로 상속된다.)<br><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e2329953-f25e-4984-87a4-5f166f646526/image.png" alt="">
유저의 인터랙션을 다루는 클래스라고 생각하면 될 것 같다 🤔<br>  <br><br><br></p>
<p>버튼의 .setTitle에서는,<br><img src="https://velog.velcdn.com/images/cur-ios-ity/post/79885ad2-fc31-4cbb-811e-9cd1511a1a63/image.png" alt="">
이렇게 버튼의 상태값도 같이 지정해 주어야 한다!  
for state: UIControl.State라고 나와있다.<br>State는 컨트롤의 현재 상태를 나타내는 상수값이다.  </p>
<p>위 코드에서 .normal은 누르지 않은 상태를,<br>.highlighted는 버튼을 누른 상태(손가락을 떼기 전)를 의미한다 :)  </p>
</blockquote>
<p><br><br></p>
<hr>
<br>

<h2 id="4-iboutlet">4. @IBOutlet</h2>
<br>

<p>뷰 객체를 변수로 지정할 때 사용하는 것이 @IBOutlet이다.
IB는 Interface Builder의 약자다.
주로 UI제어와 뷰 객체를 특정할 때 사용된다!</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/7d5af9e3-f97c-4441-9fc0-bb1974ca25f4/image.png" alt=""></p>
<p>스토리보드에서 Assistant를 열고,</p>
<p>뷰 컨트롤러 안쪽으로 *오른쪽 마우스로 드래그* 하거나
*control을 누른 상태로 왼쪽 마우스로 드래그* 하면</p>
<p>@IBOutlet 변수를 만들 수 있다 :) 
(주로 viewDidLoad() 앞에 만든다)</p>
<p>@IBAction도 동일한 방법으로 만들 수 있다!
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/bbd3f49a-8192-4409-a0d2-b51e257b3471/image.png" alt="">지정한 뷰 객체의 속성에 접근하여 모서리, 테두리 등 여러 가지 구현이 가능하다!
<br>
<a href="https://help.apple.com/xcode/mac/current/#/devc06f7ee11">→ Add an outlet connection to send a message to a UI object</a>
<br><br></p>
<hr>
<br>

<h2 id="4-ibaction">4. @IBAction</h2>
<p>사용자의 제스쳐를 통해 이벤트가 일어났을 때 실행될 기능을 정의할 때 사용된다!</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/90c803bf-5032-40a1-abe7-d0728f0db158/image.png" alt=""></p>
<p>@IBOutlet 변수와 마찬가지로
스토리보드에서 Assistant를 열고,</p>
<p>뷰 컨트롤러 안쪽으로 *오른쪽 마우스로 드래그* 하거나
*control을 누른 상태로 왼쪽 마우스로 드래그* 하면</p>
<p>@IBAction 변수를 만들 수 있다!
<br><br></p>
<p>UIButton, UISwitch 등 UIControl을 상속받는 객체들에 사용할 수 있을 것 같다 :)
<br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡TIL - 22.07.04 | Assignment #2]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.04-Assignment-2</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.04-Assignment-2</guid>
            <pubDate>Mon, 04 Jul 2022 15:53:42 GMT</pubDate>
            <description><![CDATA[<h2 id="배달의-민족-ui-구성하기">배달의 민족 UI 구성하기</h2>
<p>예시와 같이 배달의 민족 UI를 구성하면 된다!</p>
<blockquote>
<p>예시
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/79260e8c-c4dc-43a6-ba94-80bf76489179/image.png" alt=""></p>
</blockquote>
<p>음 보자마자 넘나 스유 스택에 다 넣어 버리고 싶은 것..............
스유의 유혹을 떨치고... 스토리보드로 해 보겠습니다... ㅎㅎ..
<br><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/1588d73c-d4c7-4046-85ca-ab4f9ab54af6/image.png" alt=""> 과제 내용에는 없었지만 LaunchScreen 만들기..!
화면 크기만큼 Image View를 만들고, 뭔가 위아래로 늘어나야 더 예쁜 이미지 같아서 Scale To Fill로 Content Mode 설정해서 약 10초 만에(체감상..) 런치 스크린 완성..!!!
<br><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a9b43300-0997-47da-8ef5-8c78cf80dc8e/image.png" alt="">
그리고 일단 위에 타이틀이랑 배너부터 만들어 봤다. 스토리보드로만 하려니 Content Mode중에서 골랐을 때 미적으로 좋아 보이는 이미지들이 많지 않았다.. 타이틀은 Label로 구현했는데, 글씨 크기를 키우려고 하다 보니 문득 Text에서 Plain과 Attributed의 차이가 뭔지 궁금해졌다. <a href="https://stackoverflow.com/questions/61846842/uilabel-what-is-the-difference-between-plain-and-attributed-text">갓택오버플로우</a>를 참고해 보니, 타입 자체가 다르다는 걸 알게 됐다. Plain은 String이고 Attributed는 NSAttributedString이라고 한다. <del>(뭔가 NS가 붙으면 Objc와 관련이 있는 것 같은 건 나의 착각일까..?)</del> 
<br>
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/c9b455d6-8678-42a0-9d45-67eafdc29bbd/image.png" alt="">Plain은 선택할 수 있는 폰트가 아주 제한적이지만,
<br>
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/7a83f8bb-796f-48c6-82a1-fb578549be16/image.png" alt="">Attributed는 선택할 수 있는 폰트가 아주 많다! 마침 배달의민족 폰트가 설치가 되어 있어서 사용하려고 했는데..
<br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e3a652a2-dff0-418a-a5f6-df8f9c109e1f/image.png" alt="">스토리보드에는 적용되지 않았다 🥲
찾아보니 프로젝트 자체에 폰트를 추가해야 한다고 한다..!(파일, info.plist)
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/f1fdcad6-d53e-4f3c-8528-ecf6da885de6/image.png" alt="">그리고 일단 판(?)을 만들기! 단순 드래그로 각을 맞추려니 쉽지 않다 🥲
화살표 키들의 도움을 많이 받았다 ㅎㅎ..
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b0c9c530-7278-43aa-93ba-19980b23322d/image.png" alt="">이미지와 레이블 교체해서 완성!
<br><br></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/07c125e0-a800-4fd1-bbb7-7025e5a618ce/image.png" alt="">시뮬레이터에 빌드한 모습,,
<br><br><br><br><br><br></p>
<p>쉽지만 각잡느라 오~~래 걸렸다... 
얼른 코드로 각잡고 싶다...!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[💡 TIL - 22.07.04 ]]></title>
            <link>https://velog.io/@cur-ios-ity/TIL-22.07.04</link>
            <guid>https://velog.io/@cur-ios-ity/TIL-22.07.04</guid>
            <pubDate>Mon, 04 Jul 2022 13:41:36 GMT</pubDate>
            <description><![CDATA[<h2 id="✅-checklist">✅ Checklist</h2>
<ol>
<li>Bundle Identifier</li>
<li>Human Interface Guidelines </li>
<li>SF Symbols</li>
<li>Asset</li>
<li>Launch Screen</li>
<li>Entry Point </li>
<li>Simulator Build<br>

</li>
</ol>
<hr>
<h3 id="1-bundle-identifier">1. Bundle Identifier</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/0a1713e4-b934-421a-a856-c0cb6a00e82c/image.png" width=300></img></p>
<p>앱의 고유한 ID. 우리의 주민번호와도 같다. 나중에 바꿀 수는 있지만.. 그러면 앱스토어에 아예 다른 앱으로 올라간다! 못 바꾼다고 하는 게 맞다,,
<a href="https://https://developer.apple.com/documentation/appstoreconnectapi/bundle_ids">→ Bundle IDs 보러 가기</a>
<br><br><br><br></p>
<h3 id="2-human-interface-guidelines">2. Human Interface Guidelines</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/bb0fb42b-1a69-4798-8c6b-05f68cdfb1d4/image.png" alt=""></p>
<p>줄여서 HIG라고 많이 부르는 것 같다. Apple 플랫폼의 서비스를 개발할 때 도움이 되는 가이드라인! 너무 자주(?) 보는 단순한 요소들이라 지나치기 쉽지만 꼭 필요한 이런 버튼 같은 오브젝트들이나 동작들을 자세히 서술해 놓았다. 잠시 훑어 보았는데도 아 역시 아이폰 앱들이 일관성 있고 편의성이 좋은 것이 다 이런 연구를 통해 이뤄진 거구나,, 하고 깨닫게 된다 :) 차근차근 쭉 읽어 보면 정말 많은 도움이 될 것 같다! (사용자로서 읽어보는 것도 좋을듯!!)</p>
<p><a href="https://developer.apple.com/design/human-interface-guidelines">→ Human Interface Guidelines 보러 가기</a>
<br><br><br><br></p>
<h3 id="3-sf-symbols">3. SF Symbols</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e2d6f261-33e7-43b3-ac1c-acd03ca763b5/image.png" alt="">SF Symbols에서 SF는 San Francisco를 의미한다. 애플의 시스템 폰트인 San Francisco와 스무스하게 사용될 수 있도록 디자인된 아이코노그래피 라이브러리다. 무려 4,000개가 넘는 심볼들이 있다고 한다! macOS에서는 앱도 다운이 가능하다. 심볼, 아이콘 이런 거 엄청 좋아해서 SF Symbols 앱을 한참 동안 둘러 봤던 기억이 난다. 깔끔하고 직관적이고, 왠지 모르게 개발할 때도 이미지 에셋보다 선호하게 되는 것 가틈,,</p>
<p><a href="https://developer.apple.com/sf-symbols/">→ SF Symbols 보러 가기</a>
<br><br><br><br></p>
<h3 id="4-asset">4. Asset</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/923b93fe-ba53-492d-986b-1a70b13a05e7/image.png" alt="">개발에 필요한 이미지, 컬러, 데이터 등을 의미하는 것 같다(?). 에셋 카탈로그(Assets.xcassets)를 이용하면 편리하게 관리할 수 있다 :)</p>
<p><a href="https://developer.apple.com/documentation/xcode/asset-management">→ Asset Management 보러 가기</a>
<br><br><br><br></p>
<h3 id="5-launch-screen">5. Launch Screen</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/923b93fe-ba53-492d-986b-1a70b13a05e7/image.png" alt=""> 앱이 구동될 때 처음에 보여주는 시작 씬이다. 보통 Splash 화면이라고 하는데, iOS에서는 런치 스크린이라고 부른다고 한다. 보통 이미지 정도를 띄운다고 한다! 나름 앱의 첫인상(?)이라 할 수 있을듯..?! HIG에 소개가 되어 있다.</p>
<p><a href="https://developer.apple.com/design/human-interface-guidelines/patterns/launching/">→ Launching 보러 가기</a>
<br><br><br><br></p>
<h3 id="6-entry-point">6. Entry Point</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/9491c241-dc40-4b42-a27b-31961eda837e/image.png" alt=""> 뷰 컨트롤러 왼쪽에 보이는 화살표가 Storyboard Entry Point다 :) 드래그 앤 드랍으로 다른 뷰 컨트롤러에 옮길 수도 있다. 
<br><br></p>
<blockquote>
<p>실수로 지워 버렸다면?
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/98db4ed5-dd4a-4c6b-b5a9-57e27f7278a1/image.png" alt="">
뷰 컨트롤러 선택 후 Attributes inspector에서 Is Initial View Controller에 체크해 주면 된다!
<br></p>
</blockquote>
<p><br><br><br><br></p>
<h3 id="7-simulator-build">7. Simulator Build</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/1c18b053-1837-4802-a590-742741a791fb/image.png" alt=""> 시뮬레이터를 통해 직접 아이폰에 빌드하지 않고도 빌드를 해 볼 수 있다. 단 타겟은 무조건 지정해 주어야 한다! 안그러면 오류남.. 
<br><br>
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/87f7f970-1b64-45e0-bfa7-8e24626ebc17/image.png" alt=""></p>
<p>run destination - Add Additional Simulators를 통해 아주 옛날 아이폰과 iOS 시뮬레이터도 만들 수 있다!(3GS는 없다..!)
<br><br><br><br></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS] Storyboard 사용해 보기 - Label, Button, Image View]]></title>
            <link>https://velog.io/@cur-ios-ity/iOS-Storyboard-%EC%82%AC%EC%9A%A9%ED%95%B4-%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@cur-ios-ity/iOS-Storyboard-%EC%82%AC%EC%9A%A9%ED%95%B4-%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Mon, 04 Jul 2022 08:39:45 GMT</pubDate>
            <description><![CDATA[<h3 id="스토리보드-사용해-보기">스토리보드 사용해 보기!</h3>
<p>넷플릭스를 모방한 화면 만들기</p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a276a33a-4aa7-40d9-a93b-b7326fb370fe/image.png"></img></p>
<p>처음 프로젝트를 만들고 나면, 네비게이터 영역이 위와 같이 보일 것이다.
<br/></p>
<p>여기에서 보이는 LaunchScreen과 Main 스토리보드를 사용해 보았다!
<br/></p>
<p>먼저 LaunchScreen은, 앱이 구동될 때 처음에 보여주는 시작 씬이다. 보통 Splash 화면이라고 하는데, iOS에서는 런치 스크린이라고 부른다고 한다. 보통 이미지 정도를 띄운다고 한다!
<br/><br/></p>
<hr>
<h2 id="label">Label</h2>
<p>아주아주 기본적인 오브젝트인 Label(레이블)을 LaunchScreen에 넣어 보았다. 
넣는 방법은~~
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/c8d17fe5-bf34-4dc3-86f0-d5c420c0d1a8/image.png" alt="">툴바에서 + 버튼을 누르면!
(<em>⌘⇧L이 훨씬 빠르고 편하다</em> 🏃🏻‍♀️)
<br/><br/></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/8cbcec84-6839-4a66-b6a6-997ca1320b33/image.png" alt="">이렇게 오브젝트 라이브러리가 뜬다. 레이블을 뷰 안으로 드래그 앤 드랍하면 된다!</p>
<ul>
<li>Label: 클릭이 안 되는 글자 영역
(가끔 라벨이라고 읽으시는 분들이 계시다.. 레이블이라고 읽어주세요~~....)
<br/><br/></li>
</ul>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e550d048-ddc4-4103-861c-9942c6dc81fb/image.png" alt="">레이블을 선택하고 인스펙터 영역애서 Attributes inspector를 누르면! 레이블과 관련된 attributes 설정이 가능하다. 위에 표시된 부분을 통해 텍스트와 백그라운드 컬러를 설정해 보았다. 텍스트는 레이블을 더블클릭해서 수정할 수도 있음. 
<br/><br/></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/d8ae803e-11af-4d1a-b683-868bd086fc6e/image.png" alt="">뷰를 클릭해서 뷰의 백그라운드 컬러도 설정해 보았다,, Background에서 Custom을 선택하면 원하는 컬러 선택 가능<del>.</del>
<del>(지금 보니 달걀이랑 햄같다..)</del>
<br/><br/></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2bf0a454-aab7-4bf1-8046-e2285b239f3f/image.png" alt="">
Adjust Editor Options 버튼을 누르고 Bounds Rectangles를 활성화하면 가상의 테두리도 볼 수 있다 :)
테두리나 배경이 없는 뷰들이 차지하는 영역과 뷰끼리 겹치는 영역을 확인하기 좋을 것 같다!!
물론 가상의 테두리기 때문에 빌드 시에는 보이지 않는다 
<br/><br/></p>
<p>Main 스토리보드로 넘어가 보쟝
<br/><br/></p>
<hr>
<h2 id="button">Button</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/4d6d6a17-0d94-431e-8446-5d176a3368fd/image.png" alt="">레이블과 같은 방법으로, 버튼도 오브젝트 라이브러리에서 드래그 앤 드랍으로 뷰에 넣을 수 있다! 버튼을 한 개만 만들고 복제(⌘D)했다 편하다..ㅎㅎ 버튼도 당연히 백그라운드 컬러를 지정할 수 있다.
(따로 Constraints는 주지 않고 그냥 배치했다.)
<br/><br/></p>
<h2 id="image">Image</h2>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/810d5d9c-58ad-4f63-95a4-5c56df324730/image.png" alt="">같은 방법으로 Image View를 만들고 Image와 Background를 설정해 준 모습이다.
<br/><br/>
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/20e29ee7-323c-43aa-8419-c4d539adf2ac/image.png" alt="">이미지의 경우 인스펙터에서 Content Mode를 설정할 수 있다. </p>
<h3 id="content-mode란">Content Mode란?</h3>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/f43c7624-744f-4490-97b5-1d1025648c58/image.png" alt="">뷰의 크기가 바뀔 때, 뷰가 어떻게 뷰 안의 컨텐츠들을 조절해서 보여 주는지를 설정하는 옵션이라고 볼 수 있을 것 같다.</p>
<p>Content Mode를 클릭하면 여러 가지가 나오는데.. 그 중 Scale To Fill, Aspect Fit, Aspect Fill을 살펴 보려고 한다 :)
<br/></p>
<ul>
<li><p>Scale To Fill
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/9f64a96b-fd9c-4641-8e1e-a5cc0d53526d/image.png" width="200">이미지 비율은 무시되고 이미지가 뷰를 가득 채운다. 이미지가 뷰를 가득 채우니까 백그라운드 컬러도 보이지 않게 된다.</p>
<br/>
</li>
<li><p>Aspect Fit
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/13a0c712-6bf5-4c90-bbe3-1a0f48950320/image.png" width="30%">이미지 비율은 그대로 지키며, 뷰 안에 이미지가 들어가도록, 뷰 크기에 이미지 크기가 맞춰지는 것으로 보인다!(가로, 세로 중 작은 쪽에 맞춰진다) (SwiftUI의 scaledToFit과 아주 유사해 보인다.. 같은 건가?)</p>
<br/>
</li>
<li><p>Aspect Fill
<img src="https://velog.velcdn.com/images/cur-ios-ity/post/397fdc6f-cab5-4d42-9263-998518b85316/image.png" height="300px" width="300px">이미지 비율은 그대로 지켜지는 것으로 보이고, 이미지가 뷰를 꽉 채우는 것으로 보인다. 뷰를 넘어가는 부분은 잘려서 보이지 않는다. 
<br/><br/></p>
</li>
</ul>
<hr>
<p>허접한 화면과 설명은 이쯤 그만하고,, 예시처럼 넷플릭스 화면을 만들어 보았다.</p>
<h4 id="예시">예시</h4>
<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/2dec2351-b00a-49a2-97be-95aee17654ac/image.png" width="300px"></p>
<br/><br/>

<h4 id="결과">결과</h4>
<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/3acc7184-eaa4-4005-bb81-0dd902281387/image.png" width="300px"></p>스토리보드에서 아주 흡사한 결과물을 만들 수 있었다! 미리보기에 보이는 원형 사진들은 코드로 짜야 할 것이라고 말씀해 주셨는데 스토리보드에서 완성할 수 있었다 :) Button의 Corner Style을 Capsule로 지정하고, 가로 세로 비율을 1:1 로 맞춰 원형으로 만든 후 이미지를 넣고 Stroke 설정으로 구현하였다. 탭이 가능한 오브젝트들이어야 하므로 버튼으로 구현하는 것도 나쁘지 않은 것 같다. 
<br/><br/>
<br/><br/>

<p>그런데,,,</p>
<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/a3a32122-7679-413c-bdd0-292df93a4cf4/image.png" width="300px"></p>엄... 빌드 화면이다. Button에서 Title을 지웠는데도 "Button"이라는 글자가 나타났다. 
<br/><br/><br/>

<p><a href="https://stackoverflow.com/questions/69375584/xcode-13-button-title-not-disappearing">https://stackoverflow.com/questions/69375584/xcode-13-button-title-not-disappearing</a></p>
<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/81f44199-4a8a-4a7d-9c99-dfdc3d56c64e/image.png" width="300px"></p>Button Style을 Default로 바꿔 주면 된다고 한다.(버그라는데..?)
<br/><br/><br/>

<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/e5046743-d30f-4a4d-bbf3-85e87f2c3324/image.png" width="300px"></p>하지만 난 그렇게 하면 이미지가 그대로 네모낳게 찌부되어 나오고 재생 버튼 이미지도 저렇게 나오는걸,,🫠<br/>
(Button Style을 Plain으로 지정한 후 Corner Style 등을 지정했기 때문이다)
<br/><br/><br/>

<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/fa7e8731-5b5a-46af-bd7b-8eefec588825/image.png" width="300px">
<p align="center"><img src="https://velog.velcdn.com/images/cur-ios-ity/post/19cbf6fe-50f3-4204-b8c8-3e1d503a933c/image.png" width="300px"></p>버튼의 Tint를 Clear로 설정하여 완성! 정석적인 방법은 아닌 것 같지만 코드로 구현하게 되면 더 깔끔하게 구현할 수 있지 않을까 싶다..!
<br/><br/><br/><br/><br/><br/>




<blockquote>
<p>Velog를 처음 사용해 보았는데, 이미지 크기 조절이 도무지 되지가 않아 티스토리에도 올려 두었습니다 :) 
<a href="https://cur-ios-ity.tistory.com/3">https://cur-ios-ity.tistory.com/3</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[iOS] Xcode 프로젝트 만들기 - Create a new Xcode project ]]></title>
            <link>https://velog.io/@cur-ios-ity/iOS-Xcode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-Create-a-new-Xcode-project</link>
            <guid>https://velog.io/@cur-ios-ity/iOS-Xcode-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%A7%8C%EB%93%A4%EA%B8%B0-Create-a-new-Xcode-project</guid>
            <pubDate>Mon, 04 Jul 2022 06:00:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/d87bf59f-96f0-41d3-8504-be15a0d2357f/image.png" alt=""></p>
<p>Xcode를 열면 등장하는 Welcome to Xcode에서 버전 밑에 보이는 Create a new Xcode project를 눌러 프로젝트를 만들 수 있다!
Welcome to Xcode를 닫아 버렸을 경우: Window - Welcome to Xcode (⇧⌘1)</p>
<p>혹은 File - New - Project로도 새로운 프로젝트 생성이 가능하다 :)  (⇧⌘N)
<br/><br/></p>
<p> <img src="https://velog.velcdn.com/images/cur-ios-ity/post/b698386b-ee54-4ec0-b3e8-a6fb628541fa/image.png" alt="">iOS, App을 선택하고 Next
 <br/><br/></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/6b13d458-3f6c-43e2-a4f5-72f6b856a729/image.png" alt="">프로젝트 옵션을 선택하는 화면이다. Product Name과 Identifier, Interface, Language를 선택하고 Next</p>
<ul>
<li>여기서 Bundle Identifier는 앱의 주민번호와 같은 것이다! 나중에 바꿀 수는 있지만.. 그러면 앱스토어에 아예 다른 앱으로 올라간다! 못 바꾼다고 하는 게 맞다,,</li>
<li>여기서 Team은 앱스토어에서 개발자로 나오는 이름이다!
<br/><br/></li>
</ul>
<p>프로젝트 저장 폴더를 선택하면 프로젝트가 생성된다!!
<br/><br/></p>
<p><img src="https://velog.velcdn.com/images/cur-ios-ity/post/b17d68cf-6bd9-405b-9f23-b7d4a1215b1f/image.png" alt="">
프로젝트가 생성되면, 가장 먼저 프로젝트 에디터가 열린다. 앞서 설정한 Product Name과 Display Name, 그리고 앱스토어에 보이는 이름은 모두 다른 이름들임.. Display Name은 아이폰에서 앱 아이콘 밑에 보이는 이름이다!
<br/>
학습용이면 Deployment Info에서 iOS 버전을 14.0이나 15.0 정도로 설정하면 무방하다.(iOS 14.0 권장) iOS 15.0 이라 하면 15.0 만 지원하겠다는 게 아니라, 15.0 + 지원이라는 뜻이다. 15.0과 그 이후 버전들을 지원하겠다는 말임!!
그리고 그 옆 좀 중요한 부분,, 기본 설정으로는 iPhone과 iPad에 체크가 되어 있다. 하지만 이렇게 아이폰 &amp; 아이패드용으로 출시하면, 나중에 아이폰 전용 혹은 아이패드 전용 앱으로 돌아갈 수 없다......😨 아이폰 전용 앱은 아이패드에서 검색과 다운로드가 가능하지만 미러링한 것 마냥 비율이 안 맞음(아이패드 쓰는 사람은 알 거임).. 그리고 아이패드 전용 앱은 아이폰 앱스토어에서 검색조차 불가능하다. 신중히 생각하자.. </p>
]]></description>
        </item>
    </channel>
</rss>