<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>codeGround</title>
    <link>https://codeground.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 10 Aug 2026 02:00:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>thingsu</managingEditor>
    <item>
      <title>[SwiftUI]  NavigationLink로부터  버튼 분리 독립시키기</title>
      <link>https://codeground.tistory.com/39</link>
      <description>&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/20768506/151087396-73484c1d-ab41-4b98-a8b6-36952b6ae7d7.png&quot; alt=&quot;swiftui-128x128_2x&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 TableView와 CollectionView는 List 하나로 퉁쳐지는 듯함.&lt;/li&gt;
&lt;li&gt;push 형식으로 뷰를 전환하려면 &lt;code&gt;NavigationLink&lt;/code&gt;를 통해서 움직여야함.&lt;/li&gt;
&lt;li&gt;NavigationLink로 묶여진 뷰 안에 버튼 이벤트를 독립적으로 분리시키고 싶음.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시도&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hitTest나 ZStack 등 다양하게 시도해봄&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NavigationLink의 UI를 disabled시키고 버튼(또는 이미지, 뷰 등) 이벤트를 통해 간접적으로 NavigationLink를 호출&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;VStack { 
    Button(&quot;독립적인 이벤트 실행&quot;) {
        // 어떤 이벤트
    }.sheet(isPresented: $firstViewPresented) // 또는 first뷰를 sheet 형식으로 띄움

    Image(systemName: &quot;circle.fill&quot;)
        .onTapGesture {
            selection = &quot;이미지를 눌렀다고 한다&quot;
        }
     NavigationLink(destination: PushedView(), tag: &quot;이미지를 눌렀다고 한다&quot;, selection: $selection) {}
     .disabled(true) // &amp;lt;-- 이게 중요. UI 동작을 막아야함
     .opacity(0) // &amp;lt;-- List  느낌을 감추고 싶다면 NavigationLink 자체를 감춰버린다.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 구성하면 Image의 onTapGesture를 통해 selection이 설정되고, 그에 따라 NavigationLink가 실행된다.&lt;br /&gt;어찌저찌 해결하긴 했지만 정말 이 방법밖에 없나.. 싶음.&lt;/p&gt;</description>
      <category>iOS:Swift/SwiftUI + Combine</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/39</guid>
      <comments>https://codeground.tistory.com/39#entry39comment</comments>
      <pubDate>Tue, 25 Jan 2022 20:40:04 +0900</pubDate>
    </item>
    <item>
      <title>Xcode 13에서 package loading fail 대처하기</title>
      <link>https://codeground.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Xcode 12를 쓰다가 이러저러한 이유로 Xcode 13으로 업데이트를 했다. 으레 그렇듯 빌드에 실패했는데 다행히 이전처럼 디렉토리에 들어가서 파일 덮어쓰고 이런 건 없는 것 같은데 SPM을 사용한데서 빌드 fail이 났다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결법은 아주 간단!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;File -&amp;gt; Packages -&amp;gt; Reset Package Caches&lt;/code&gt; 경로에서 SPM 캐시를 초기화해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오히려 코코아팟 등보다 문제가 단순하게 해결됨&lt;/p&gt;</description>
      <category>iOS:Swift/Xcode</category>
      <category>Build error</category>
      <category>Swift Package Manager</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/38</guid>
      <comments>https://codeground.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 31 Dec 2021 01:34:10 +0900</pubDate>
    </item>
    <item>
      <title>architecture arm64 에러</title>
      <link>https://codeground.tistory.com/37</link>
      <description>&lt;h3&gt;문제점&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Pods/GoogleSignIn/Frameworks/GoogleSignIn.framework/GoogleSignIn&amp;#39; for architecture arm64&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;인텔 맥에서 작업한 프로젝트를 m1에서 이어서 작업하려고 하는데 빌드하면서 좋지 않은 에러가 나타났다. 이전에는 문제가 없었는데 해당 라이브러리 관련 문제일까? &lt;/p&gt;
&lt;h3&gt;원인&lt;/h3&gt;
&lt;p&gt;자세히 알아보아야겠지만 어느때처럼 Xcode 12 버그로 보인다. 아키텍처는 arm64인데 엑코에서 &lt;code&gt;arm64&lt;/code&gt;라고 설정을 해주지 않아서 생기는 문제(?)인 것으로 보이고 해외에서도 많은 사례가 있었다.&lt;/p&gt;
&lt;h3&gt;해결&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;Xcode -&amp;gt; Target Project -&amp;gt; Build Setting -&amp;gt; Excluded Architectures &amp;gt; &amp;quot;arm64&amp;quot;
Xcode -&amp;gt; Pod Target -&amp;gt; Build Setting -&amp;gt; Excluded Architectures &amp;gt; &amp;quot;arm64&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;너네 m1 밀고 있는 거 맞니..암튼 target project와 pod target에서 모두 arm64를 사용하겠다고 직접 명시함으로써 빌드 에러 해결..&lt;/p&gt;
&lt;h3&gt;참고자료&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/63607158/xcode-12-building-for-ios-simulator-but-linking-in-object-file-built-for-ios&quot;&gt;https://stackoverflow.com/questions/63607158/xcode-12-building-for-ios-simulator-but-linking-in-object-file-built-for-ios&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.apple.com/forums/thread/660782&quot;&gt;https://developer.apple.com/forums/thread/660782&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>iOS:Swift/Xcode</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/37</guid>
      <comments>https://codeground.tistory.com/37#entry37comment</comments>
      <pubDate>Sun, 11 Jul 2021 18:44:08 +0900</pubDate>
    </item>
    <item>
      <title>애플ID로 로그인(feat. 파이어베이스)</title>
      <link>https://codeground.tistory.com/36</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;iOS용 애플ID로 로그인&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Identifiers &amp;rarr; 해당 앱 ID를 사용하는 ID &amp;rarr; Capabilities 목록에서 Sign in with Apple 선택 &amp;rarr; &lt;a href=&quot;https://simpass.firebaseapp.com/__/auth/handler&quot;&gt;&lt;code&gt;https://{FIREBASE_PROJECT_ID}.firebaseapp.com/__/auth/handler&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;끝.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기타(안드로이드) 애플ID로 로그인&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위에서 한 작업에 추가적으로 아래 작업들을 해주어야함&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Identifiers &amp;rarr; ServiceID 생성 &amp;rarr; &lt;a href=&quot;https://simpass.firebaseapp.com/__/auth/handler&quot;&gt;&lt;code&gt;https://simpass.firebaseapp.com/__/auth/handler&lt;/code&gt;&lt;/a&gt; 입력&lt;/li&gt;
&lt;li&gt;Keys &amp;rarr; Sign in with Apple &amp;rarr; &lt;code&gt;Key ID&lt;/code&gt;와 &lt;code&gt;팀 ID&lt;/code&gt; 획득
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;팀ID는 개발자 계정의 ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.p8&lt;/code&gt; 인증서 파일 다운되면 텍스트 편집기로 열어서 &lt;code&gt;private key&lt;/code&gt; 획득&lt;/li&gt;
&lt;li&gt;More &amp;rarr; Sign in with Apple for Email Communication에서 &lt;code&gt;{FIREBASE_PROJECT_ID}.firebaseapp.com&lt;/code&gt;과 &lt;code&gt;noreply@{FIREBASE_PROJECT_ID}.firebaseapp.com&lt;/code&gt; 입력.&lt;/li&gt;
&lt;li&gt;파이어베이스 Authentication에서 서비스ID에 &lt;code&gt;1의 ServiceID&lt;/code&gt; 입력&lt;/li&gt;
&lt;li&gt;OAuth 코드 흐름 구성에서 팀 ID에 &lt;code&gt;2의 팀 ID&lt;/code&gt; 입력.&lt;/li&gt;
&lt;li&gt;키 ID에 &lt;code&gt;2의 키ID&lt;/code&gt; 입력&lt;/li&gt;
&lt;li&gt;비공개 키에 &lt;code&gt;3의 비공개 키&lt;/code&gt; 입력&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>iOS:Swift</category>
      <category>Firebase</category>
      <category>sign in with apple</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/36</guid>
      <comments>https://codeground.tistory.com/36#entry36comment</comments>
      <pubDate>Mon, 5 Jul 2021 23:27:43 +0900</pubDate>
    </item>
    <item>
      <title>fastlane 1: 설치와 초기셋팅</title>
      <link>https://codeground.tistory.com/34</link>
      <description>&lt;h1&gt;install&lt;/h1&gt;
&lt;p&gt;hombrew를 이용한 방법&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install cask # cask가 설치되어있는 경우 생략
brew install --cask fastlane # fastlane을 cask로 설치

# 설치 완료후
fastlane env # 설치 버전 확인&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rubygems를 이용한 방법&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo gem install fastlane -NV&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;usage&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;패스트래인을 적용하려는 프로젝트로 이동 후&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; fastlane init&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;init을 성공하면 애플 아이디/비밀번호를 입력하라는데 개발자 계정과 사용자 계정을 나누어야겠다는 생각이 들었음. 암튼 임력.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git status나 프로젝트 파인더로 보면 fastlane이라는 폴더가 생김. 그 아래에는 Appfile, Deliverfile, Fastfile이 있음.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appfile: 패스트레인을 적용하려는 앱에 대한 정보. 개발자 계정에 대한 정보도 있다.&lt;/li&gt;
&lt;li&gt;Deliverfile: 앱스토어에 전달하는 메타데이터 관련 인듯&lt;/li&gt;
&lt;li&gt;fastfile: 패스트레인을 통해 자동화 프로그래밍을 하는 곳&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;다양한 자동화가 가능한데 가장 반복적이고 손 많이 가는 앱스토어 릴리즈를 해봅시다&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt; platform :ios do
   desc &amp;quot;Push a new release build to the App Store&amp;quot;
   lane :release do
     build_app(workspace: &amp;quot;프로젝트명.xcworkspace&amp;quot;, scheme: &amp;quot;프로젝트 스킴명&amp;quot;)
     upload_to_app_store
   end
 end&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; 위 구문을 분석해보면 간단하다. 3번째줄 lane부터가 실제로 작업하는 부분이고, &lt;code&gt;release&lt;/code&gt;레인일 경우 1) 앱을 빌드하고, 2) 앱스토어에 업로드한다. 두 함수를 실행하는 구문임. 개인적으로는 개발자 계정과 인증서 관리를 조금 지저분하게 해서 이 단계에서 사이닝 관련 문제가 있었는데 그 부분은 다음에..&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>iOS:Swift</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/34</guid>
      <comments>https://codeground.tistory.com/34#entry34comment</comments>
      <pubDate>Wed, 3 Mar 2021 22:05:42 +0900</pubDate>
    </item>
    <item>
      <title>애플실리콘에서 cocoapods 빌드하기</title>
      <link>https://codeground.tistory.com/33</link>
      <description>&lt;h3&gt;Homebrew&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# arm용: /opt/homebrew
/bin/bash \-c &amp;quot;$(curl \-fsSL [https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh](https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh))&amp;quot;

# x86용: /usr/local/homebrew
# 로제타2를 통해서 작동
arch -x86_64 /bin/bash \-c &amp;quot;$(curl \-fsSL [https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh](https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh))&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;arm에서 brew를 설치하고, cocoapods는 x86(rosetta)으로 실행해도 됨. cocoapods의 문제로 보임.&lt;/p&gt;
&lt;h3&gt;Cocoapods&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;m1에서 cocoapods 빌드하기: rosetta 터미널 에서 실행&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  sudo gem install cocoapods
  sudo gem install ffi

  pod install

  # 그래도 에러가 날 땐 코코아팟을 클린삭제하고 재설치
  sudo gem install cocoapods-deintegrate cocoapods-clean
  pod deintegrate
  pod clean

  pod install&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;pod install&lt;/code&gt;은 해당 프로젝트 내에서 실행해야함. (Podfile이 있는 경로)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS:Swift/Xcode</category>
      <category>cocoapod</category>
      <category>cocoapods</category>
      <category>M1</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/33</guid>
      <comments>https://codeground.tistory.com/33#entry33comment</comments>
      <pubDate>Tue, 2 Mar 2021 22:36:41 +0900</pubDate>
    </item>
    <item>
      <title>맥에서 억음부호(`, grave accent) 쓰기</title>
      <link>https://codeground.tistory.com/32</link>
      <description>&lt;p&gt;맥에선 기본적으로 한글일 때와 영문일 때 특수기호를 다르게 받아들인다. 한글로 놓고 억음부호(`)를 누르면 원화(₩)가 표시된다. 영문으로 놓아야만 억음부호를 억음부호로 쓸 수 있다. 하지만 마크다운을 많이 쓰다보면 억음부호를 자주 쓰게 되는데..&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;~/Libary&lt;/code&gt; 폴더에 &lt;code&gt;KeyBindings&lt;/code&gt; 폴더 생성: 파인더 단축키 &lt;code&gt;커맨드+쉬프트+G&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/Libary/KeyBindings&lt;/code&gt; 경로에 &lt;code&gt;DefaultkeyBinding.dict&lt;/code&gt; 파일 생성.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;// DefaultkeyBinding.dict { &amp;quot;₩&amp;quot; = (&amp;quot;insertText:&amp;quot;, &amp;quot;`&amp;quot;); }&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;재부팅&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;또는 터미널에서 아래 명령어를 입력한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if [ -f ~/Library/KeyBindings/DefaultkeyBinding.dict ]; then
    echo &amp;quot;~/Library/KeyBindings/DefaultkeyBinding.dict already exists&amp;quot;
fi

mkdir -p ~/Library/KeyBindings
cat &amp;lt;&amp;lt; EOF &amp;gt; ~/Library/KeyBindings/DefaultkeyBinding.dict 
{
    &amp;quot;₩&amp;quot; = (&amp;quot;insertText:&amp;quot;, &amp;quot;\`&amp;quot;);
}
EOF

echo &amp;quot;Done.&amp;quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/32</guid>
      <comments>https://codeground.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 14 Feb 2021 22:46:59 +0900</pubDate>
    </item>
    <item>
      <title>git author 한번에 모두 바꾸기</title>
      <link>https://codeground.tistory.com/31</link>
      <description>&lt;p&gt;여러 계정을 사용하든, config에서 오타를 냈든, author나 committer 등 커밋 변수들을 잘못 쓰는 경우가 있는데,&lt;/p&gt;
&lt;p&gt;안타깝게도 그것을 발견한 것은 한참 후라면?&lt;/p&gt;
&lt;p&gt;
&lt;script src=&quot;https://gist.github.com/m0su/c2bad79eb32396336f93710a4f91cb5f.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;filter-branch&lt;/code&gt;는 히스토리 전체에서 원하는 것만 가져올 수 있음&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--env-filter&lt;/code&gt;는 커밋이 수행되는 환경에 필터를 걸 수 있음: author, committer, name, email, time 등의 환경변수들!&lt;br /&gt;&lt;a href=&quot;https://git-scm.com/docs/git-filter-branch&quot;&gt;참고&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;위와 같은 에러가 뜰 때가 있는데 아래 명령어로 해결 가능&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;git update-ref -d refs/original/refs/heads/master&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dsaint31.me/etc/etc-git-filter-branch/&quot;&gt;참고&lt;/a&gt;&lt;/p&gt;</description>
      <category>git</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/31</guid>
      <comments>https://codeground.tistory.com/31#entry31comment</comments>
      <pubDate>Thu, 4 Feb 2021 00:53:35 +0900</pubDate>
    </item>
    <item>
      <title>iOS 로드맵</title>
      <link>https://codeground.tistory.com/30</link>
      <description>&lt;h1&gt;roadmap&lt;/h1&gt;
&lt;p&gt;웹 개발자 로드맵은 매년 업데이트 되고 쉽게 구할 수 있는데, iOS 개발자 로드맵은 그렇지 않았다. 그러던 중 모든게 다 있는 git에서 귀중한 자료를 발견함&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;개발자 로드맵: &lt;a href=&quot;https://roadmap.sh/&quot;&gt;https://roadmap.sh/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;iOS개발자 로드맵: &lt;a href=&quot;https://github.com/godrm/mobile-developer-roadmap&quot;&gt;https://github.com/godrm/mobile-developer-roadmap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/20768506/106384565-d3c2a280-640e-11eb-813e-645ba8c7853c.png&quot; alt=&quot;1 mobile_roadmap&quot;&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/20768506/106384563-d2917580-640e-11eb-9f30-8cf8844c5247.png&quot; alt=&quot;2 ios_roadmap&quot;&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/20768506/106384560-cefdee80-640e-11eb-98ac-e7d767dba6a3.png&quot; alt=&quot;3 swift_roadmap&quot;&gt;&lt;/p&gt;
&lt;h1&gt;iOS 로드맵&lt;/h1&gt;
&lt;h3&gt;Xcode IDE&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Playground&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Swift&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Functional Programming&lt;ul&gt;
&lt;li&gt;vs &lt;strong&gt;Object-oriented Programming(with ObejctiveC)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Protocol-Oriented Programming&lt;ul&gt;
&lt;li&gt;Value Semantics&lt;/li&gt;
&lt;li&gt;Generics&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Concurrent Programming&lt;ul&gt;
&lt;li&gt;Swift Standard&lt;/li&gt;
&lt;li&gt;Swift Foundation&lt;/li&gt;
&lt;li&gt;DispatchQueue&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Human Interfacce Guiodeline&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mobile&lt;/li&gt;
&lt;li&gt;Apple&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;iOS Technologies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;App Architect&lt;/li&gt;
&lt;li&gt;App Life-cycle&lt;/li&gt;
&lt;li&gt;View-ViewController Programming&lt;ul&gt;
&lt;li&gt;AutoLayout&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Multi-touch Event Handling&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cocoa Design Pattern&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MVC&lt;/li&gt;
&lt;li&gt;Singleton&lt;/li&gt;
&lt;li&gt;Delegate&lt;/li&gt;
&lt;li&gt;RespnderChain&lt;/li&gt;
&lt;li&gt;Observer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Network Programming&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;RESTful APIs&lt;/li&gt;
&lt;li&gt;TCP/IP Socket APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;System Framework&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Core Foundation&lt;/li&gt;
&lt;li&gt;Cocoa Touch&lt;/li&gt;
&lt;li&gt;Core Data&lt;ul&gt;
&lt;li&gt;Sqlite&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Concurrent Programming&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ARC&lt;/li&gt;
&lt;li&gt;Block&lt;/li&gt;
&lt;li&gt;GCD Queue&lt;/li&gt;
&lt;li&gt;GCD Event&lt;/li&gt;
&lt;li&gt;Runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Reactive Programming&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Combine&lt;/li&gt;
&lt;li&gt;SwiftUI&lt;/li&gt;
&lt;li&gt;RxSwift&lt;/li&gt;
&lt;li&gt;ReactiveCococa&lt;/li&gt;
&lt;li&gt;VIPER&lt;/li&gt;
&lt;li&gt;MVVM&lt;/li&gt;
&lt;li&gt;ReactorKit&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Data Persistance&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Realm&lt;/li&gt;
&lt;li&gt;Serialize&lt;ul&gt;
&lt;li&gt;Plist&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;Keychain&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;KeyedArchiver&lt;/li&gt;
&lt;li&gt;Cloud&lt;ul&gt;
&lt;li&gt;iCloud&lt;/li&gt;
&lt;li&gt;Firebase&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Project &amp;amp; Wrokspace&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Build Config&lt;/li&gt;
&lt;li&gt;Schame&lt;/li&gt;
&lt;li&gt;Target&lt;/li&gt;
&lt;li&gt;Swift Package Manager&lt;/li&gt;
&lt;li&gt;Cocoapod&lt;/li&gt;
&lt;li&gt;Carthage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Instruments&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Allocations&lt;/li&gt;
&lt;li&gt;Leak&lt;/li&gt;
&lt;li&gt;Time Profile&lt;/li&gt;
&lt;li&gt;Network&lt;/li&gt;
&lt;li&gt;Activity&lt;/li&gt;
&lt;li&gt;Energy&lt;/li&gt;
&lt;li&gt;Layout&lt;/li&gt;
&lt;li&gt;System Trace&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Test&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;XCTest&lt;ul&gt;
&lt;li&gt;TDD&lt;/li&gt;
&lt;li&gt;Quick / Nimble&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UI Test&lt;/li&gt;
&lt;li&gt;Code Coverage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Debugging&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;LLDB&lt;/li&gt;
&lt;li&gt;Break-Pointer&lt;/li&gt;
&lt;li&gt;Gauges&lt;/li&gt;
&lt;li&gt;Visual Debugging&lt;ul&gt;
&lt;li&gt;Sanitizer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Diagnostics&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Build &amp;amp; Deployment&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;CI&lt;ul&gt;
&lt;li&gt;Fastlane&lt;/li&gt;
&lt;li&gt;Xcode Server&lt;/li&gt;
&lt;li&gt;bitrise&lt;/li&gt;
&lt;li&gt;Travis&lt;/li&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Analytic Tools&lt;ul&gt;
&lt;li&gt;TestFlight&lt;/li&gt;
&lt;li&gt;Firebase&lt;ul&gt;
&lt;li&gt;Crashlytics&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GA&lt;/li&gt;
&lt;li&gt;UserHabit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;App Store&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Review Guideline&lt;/li&gt;
&lt;li&gt;iTunes Connect&lt;/li&gt;
&lt;li&gt;Lucky Reviewer&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Swift 로드맵&lt;/h1&gt;
&lt;h3&gt;Data Presentation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Constants&lt;/li&gt;
&lt;li&gt;Variables&lt;ul&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Primitive Types&lt;ul&gt;
&lt;li&gt;Interger (Numeric Literals)&lt;/li&gt;
&lt;li&gt;Float and Double (Numeric Literals)&lt;/li&gt;
&lt;li&gt;Boolean&lt;/li&gt;
&lt;li&gt;String and Character&lt;ul&gt;
&lt;li&gt;Unicode&lt;/li&gt;
&lt;li&gt;Substring and Indices&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Optional&lt;ul&gt;
&lt;li&gt;nil&lt;/li&gt;
&lt;li&gt;Optional binding&lt;/li&gt;
&lt;li&gt;Optional chaining&lt;/li&gt;
&lt;li&gt;IUO&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tuples&lt;/li&gt;
&lt;li&gt;Conversion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Collection&lt;ul&gt;
&lt;li&gt;Array&lt;/li&gt;
&lt;li&gt;Set&lt;/li&gt;
&lt;li&gt;Dictionary&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Prodecural presentation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ternary&lt;/li&gt;
&lt;li&gt;binary&lt;/li&gt;
&lt;li&gt;unary&lt;/li&gt;
&lt;li&gt;assignment&lt;/li&gt;
&lt;li&gt;arithmetic&lt;/li&gt;
&lt;li&gt;Comparison&lt;/li&gt;
&lt;li&gt;Range&lt;/li&gt;
&lt;li&gt;Logical&lt;/li&gt;
&lt;li&gt;Combinations&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Control Flow&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;While Llops&lt;/li&gt;
&lt;li&gt;For-In Loops&lt;/li&gt;
&lt;li&gt;If- else&lt;/li&gt;
&lt;li&gt;switch-case&lt;/li&gt;
&lt;li&gt;#Availability&lt;/li&gt;
&lt;li&gt;guard&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Functions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Parameters and Returns&lt;/li&gt;
&lt;li&gt;Function Types&lt;/li&gt;
&lt;li&gt;Opaque Types&lt;/li&gt;
&lt;li&gt;In-Out&lt;/li&gt;
&lt;li&gt;Nested Functions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Structural Value Types&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;ul&gt;
&lt;li&gt;class &amp;amp; struct&lt;ul&gt;
&lt;li&gt;Properties&lt;ul&gt;
&lt;li&gt;Stored&lt;/li&gt;
&lt;li&gt;Wrapper&lt;/li&gt;
&lt;li&gt;Computed&lt;/li&gt;
&lt;li&gt;Observers&lt;/li&gt;
&lt;li&gt;Type Property&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Methods&lt;ul&gt;
&lt;li&gt;Instance&lt;/li&gt;
&lt;li&gt;Type Methods&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Subscript&lt;ul&gt;
&lt;li&gt;Options&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Initialization&lt;ul&gt;
&lt;li&gt;Delegation&lt;/li&gt;
&lt;li&gt;Two-Phase&lt;/li&gt;
&lt;li&gt;Failable&lt;/li&gt;
&lt;li&gt;Required&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deinitialization&lt;/li&gt;
&lt;li&gt;Inheritence&lt;ul&gt;
&lt;li&gt;Subclassing&lt;/li&gt;
&lt;li&gt;Overriding&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;enum&lt;ul&gt;
&lt;li&gt;Associated Values&lt;/li&gt;
&lt;li&gt;Raw Values&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Functional Programming&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;High-order Functions&lt;/li&gt;
&lt;li&gt;First-Class Function&lt;/li&gt;
&lt;li&gt;Immutable Values&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Extenstions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Confirm Protocol&lt;/li&gt;
&lt;li&gt;Initializer&lt;/li&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Properties&lt;/li&gt;
&lt;li&gt;Nested Type&lt;/li&gt;
&lt;li&gt;Subscript&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Protocol&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Protocols as Types&lt;/li&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;li&gt;Method Requirements&lt;/li&gt;
&lt;li&gt;Delegation&lt;/li&gt;
&lt;li&gt;Default Implementation&lt;/li&gt;
&lt;li&gt;Property Requirements&lt;/li&gt;
&lt;li&gt;Optional&lt;/li&gt;
&lt;li&gt;Initializer Requirements&lt;/li&gt;
&lt;li&gt;Inheritance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Generics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Associated Types&lt;/li&gt;
&lt;li&gt;Generic Functions&lt;/li&gt;
&lt;li&gt;Type Parameters&lt;/li&gt;
&lt;li&gt;Type Constraitns&lt;/li&gt;
&lt;li&gt;Generic Types&lt;/li&gt;
&lt;li&gt;Generic Subscript&lt;/li&gt;
&lt;li&gt;Generic Where Clouser&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Error Handling&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;throws&lt;/li&gt;
&lt;li&gt;do-catch&lt;/li&gt;
&lt;li&gt;Error Protocol&lt;/li&gt;
&lt;li&gt;rethrows&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Memory&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Strong Refrence&lt;ul&gt;
&lt;li&gt;Refrence Cycle&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weak Refrence&lt;/li&gt;
&lt;li&gt;Unowned Refrence&lt;/li&gt;
&lt;li&gt;Access Layout&lt;/li&gt;
&lt;li&gt;UnsafePointer&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Access Control&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Private&lt;/li&gt;
&lt;li&gt;File private&lt;/li&gt;
&lt;li&gt;Internal&lt;/li&gt;
&lt;li&gt;Public&lt;/li&gt;
&lt;li&gt;Open&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Debug&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Assertions&lt;/li&gt;
&lt;li&gt;Presonditions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;with Objective-C&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Migration&lt;/li&gt;
&lt;li&gt;Import from/to&lt;/li&gt;
&lt;li&gt;Interoperability&lt;/li&gt;
&lt;li&gt;Bridge Header&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>iOS:Swift</category>
      <category>developer</category>
      <category>ios</category>
      <category>roadmap</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/30</guid>
      <comments>https://codeground.tistory.com/30#entry30comment</comments>
      <pubDate>Sun, 31 Jan 2021 21:50:35 +0900</pubDate>
    </item>
    <item>
      <title>Iterator</title>
      <link>https://codeground.tistory.com/29</link>
      <description>&lt;p&gt;스위프트와 파이썬을 함께 써보니 비슷한 점 많다. 다른 점 가운데서 편리하면서도 불편한게 변수 선언인데, 별도의 선언이 필요없어서 깊은 생각 없이 변수를 만들다보니 메모리 등에 대한 걱정도 든다.&lt;/p&gt;
&lt;p&gt;파이썬은 기본적으로 for in 구문을 통한 반복문을 제공한다. &lt;code&gt;for A in B&lt;/code&gt;구문은 B가 집단 자료형(Array, Dictionary 등 Collection)일 때 요소를 하나씩(순서가 있다면 앞에서부터) 꺼내어 A에 대입시켜 for문 안에서 사용하는 것으로 스위프트에서도 지원한다. count가 필요한 경우 아래 2가지 방법으로 사용할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 1. count 변수를 사용하는 방법
count = 0
for item in a_list:
    count += 1
    print(count)

# 2. enumerate 객체를 사용하는 방법
for count, item in enumerate(a_list):
    print(count)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kite.com/python/docs/builtins.enumerate&quot;&gt;https://www.kite.com/python/docs/builtins.enumerate&lt;/a&gt;&lt;/p&gt;</description>
      <category>python</category>
      <author>thingsu</author>
      <guid isPermaLink="true">https://codeground.tistory.com/29</guid>
      <comments>https://codeground.tistory.com/29#entry29comment</comments>
      <pubDate>Mon, 25 Jan 2021 21:39:37 +0900</pubDate>
    </item>
  </channel>
</rss>