<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>우당탕탕 프로그래밍</title>
    <link>https://yejprogramming.tistory.com/</link>
    <description>꿈꾸는 개발자 스윗프트               
(sweet + swift)</description>
    <language>ko</language>
    <pubDate>Sat, 22 Aug 2026 06:48:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Sweetft</managingEditor>
    <image>
      <title>우당탕탕 프로그래밍</title>
      <url>https://tistory1.daumcdn.net/tistory/4946870/attach/0d632ed70143458b92116f429628c8c0</url>
      <link>https://yejprogramming.tistory.com</link>
    </image>
    <item>
      <title>RxSwift 파헤치기 도전! (2) Observable</title>
      <link>https://yejprogramming.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실습에 들어가기 전, Rx의 심장이라는 Observable에 대해 알아보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Observable = Observable Sequence = Sequence&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Asynchronous(비동기적)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Observable은 일정 기간 동안 계속해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이벤트&lt;/b&gt;를 생성하며, 이러한 과정을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;emitting&lt;/b&gt;(방출)이라고 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- marble diagram 시간의 흐름에 따라 값을 표시하는 방식(시간의 흐름은 왼쪽 -&amp;gt; 오른쪽)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://rxmarbles.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://rxmarbles.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673254224484&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;RxMarbles: Interactive diagrams of Rx Observables&quot; data-og-description=&quot;&quot; data-og-host=&quot;rxmarbles.com&quot; data-og-source-url=&quot;http://rxmarbles.com/&quot; data-og-url=&quot;https://rxmarbles.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://rxmarbles.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://rxmarbles.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RxMarbles: Interactive diagrams of Rx Observables&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;rxmarbles.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;(생명주기) Obeservable은&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mKxa4/btrVIuTniUV/5Fa6huePNB2GXgEs82wS51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mKxa4/btrVIuTniUV/5Fa6huePNB2GXgEs82wS51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mKxa4/btrVIuTniUV/5Fa6huePNB2GXgEs82wS51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmKxa4%2FbtrVIuTniUV%2F5Fa6huePNB2GXgEs82wS51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;248&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 어떤 구성요소를 가지는 next 이벤트를 계속해 방출할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. error 이벤트를 방출해 완전 종료될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. complete 이벤트를 방출하여 완전 종료될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;Observable의 메서드&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1673938116729&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit
import RxSwift

print(&quot;****  just  ****&quot;)
//하나의  엘레먼트를 를 방출하는 observable
Observable&amp;lt;Int&amp;gt;.just(1)
    .subscribe(onNext: {
        print($0)
    })

print(&quot;****  of  ****&quot;)
//하나 이상의 엘레먼트 방출
Observable&amp;lt;Int&amp;gt;.of(1, 2, 3, 4, 5)
    .subscribe(onNext: {
        print($0)
    })
Observable.of([1, 2, 3, 4, 5]) //타입 추론 가능, array를 넣을 경우 just 연산자 처럼 사용 가능
    .subscribe(onNext: {
        print($0)
    })
    
print(&quot;****  from  ****&quot;)
Observable.from([1, 2, 3]) //array만 가능, array로 방출하지 않고 요소 하나씩 방출함
    .subscribe(onNext: {
        print($0)
    })

// observable은 그냥 sequence 정의임. 구독(subscribe) 전에는 아무 이벤트도 방출하지 않음.
print(&quot;****  subscribe  ****&quot;)
Observable.of(1, 2, 3)
    .subscribe{
        print($0)
    }
Observable.of(1, 2, 3)
    .subscribe{
        if let element = $0.element {
            print(element)
        }
    }
Observable.of(1, 2, 3)
    .subscribe(onNext: {
        print($0)
    })

print(&quot;****  empty  ****&quot;)
//아무런 엘리먼트 없음. 즉시 종료할 수 있는 옵저버블 리턴하고 싶을 때, 0개의 값을 리턴하고 싶을 때 사용함.
Observable.empty()
    .subscribe {
        print($0)
    }

print(&quot;****  never  ****&quot;)
//작동은 하지만 아무것도 내뱉지 않음
Observable.never()
    //.debug(&quot;never&quot;)
    .subscribe(
        onNext: {
            print($0)
        },
        onCompleted: {
            print(&quot;completed&quot;) //출력안됨
        }
    )


print(&quot;****  range  ****&quot;)
//array를 start 부터 count 크기 만큼 값을 가짐
Observable.range(start: 1, count: 9)
    .subscribe(onNext: {
        print(&quot;2*\($0)=\(2*$0)&quot;)
    })

print(&quot;****  dispose  ****&quot;)
//observable 구독 취소
Observable.of(1, 2, 3)
    .subscribe(onNext: {
        print($0)
    })
    .dispose()

print(&quot;****  disposeBag  ****&quot;)
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
    .subscribe{
        print($0)
    }
    .disposed(by: disposeBag)

print(&quot;****  create1  ****&quot;)
Observable&amp;lt;Int&amp;gt;.create { observer -&amp;gt; Disposable in
    observer.onNext(1)
    observer.onCompleted() //observable 종료
    observer.onNext(2) //방출안됨
    return Disposables.create()
}
.subscribe {
    print($0)
}
.disposed(by: disposeBag)

print(&quot;****  create2  ****&quot;)
enum MyError: Error {
    case anError
}
Observable&amp;lt;Int&amp;gt;.create { observer -&amp;gt; Disposable in
    observer.onNext(1)
    observer.onError(MyError.anError)
    observer.onCompleted()
    observer.onNext(2)
    return Disposables.create()
}
.subscribe(
    onNext: {
        print($0)
    },
    onError: {
        print($0.localizedDescription)
    },
    onCompleted: {
        print(&quot;completed&quot;)
    },
    onDisposed: {
        print(&quot;disposed&quot;)
    }
)
.disposed(by: disposeBag)

print(&quot;****  deferred1  ****&quot;)
//observable을 생성할 수 있는 또다른 방식
//각 subscribe 새롭게 observable 항목 제공
Observable.deferred {
    Observable.of(1, 2, 3)
}
.subscribe {
    print($0)
}
.disposed(by: disposeBag)

print(&quot;****  deferred2  ****&quot;)
var flip: Bool = false
let fatory: Observable&amp;lt;String&amp;gt; = Observable.deferred {
    flip = !flip
    
    if flip {
        return Observable.of(&quot;hi&quot;)
    } else {
        return Observable.of(&quot;bye&quot;)
    }
}
for _ in 0...3 {
    fatory.subscribe(onNext: {
        print($0)
    })
    .disposed(by: disposeBag)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;참고&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패스트캠퍼스 온라인 강의&lt;/p&gt;</description>
      <category>iOS/Swift실전</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/73</guid>
      <comments>https://yejprogramming.tistory.com/73#entry73comment</comments>
      <pubDate>Tue, 17 Jan 2023 15:49:24 +0900</pubDate>
    </item>
    <item>
      <title>Swift의 고차함수에 대해 알아보자. (Map,Filter,Reduce)</title>
      <link>https://yejprogramming.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;부끄럽지만 iOS 프로그래밍을 하며 고차함수에 대한 이론만 공부하고 제대로 실전에서 사용을 해본 적이 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 이론을 다시 공부하며 고차함수에 대해 제대로 이해하고 사용법도 익혀보고자 이 글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 Filter, Map, Reduce에 대해 정리하기 전, 고차함수란 무엇일까?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;다른 함수를 전달인자(argument)로 받거나 함수 실행의 결과로 함수를 반환하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트의 함수가 일급객체라는 것을 아니 무슨 소리인지 이해가 간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yejprogramming.tistory.com/7&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673494585259&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift) iOS 프로그래밍 함수, 1급객체, 클로저, 클래스&quot; data-og-description=&quot;함수 함수의 타입 (자료형, 자료형, ...) -&amp;gt; 리턴형(Int, Int, ...) -&amp;gt; Int =&amp;gt; 리턴형이 Void형이면 () 함수의 자료형 출력 print(type(of:함수몀)) func sum(num1 x: Int, sum2 y: Int) -&amp;gt; Int { return(x+y) //함수 정의 } sum(num1:&quot; data-og-host=&quot;yejprogramming.tistory.com&quot; data-og-source-url=&quot;https://yejprogramming.tistory.com/7&quot; data-og-url=&quot;https://yejprogramming.tistory.com/7&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctx4WM/hyRgpzh4dn/hOdhmyKwAKGDmVS66IBjD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Byb91/hyRgkxY9YH/hygJoCcq77KPUEv3VvaTE0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c7oeqP/hyRgh8565p/zJpKKbHKuL5c123mfl6U5K/img.jpg?width=754&amp;amp;height=760&amp;amp;face=0_0_754_760&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yejprogramming.tistory.com/7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctx4WM/hyRgpzh4dn/hOdhmyKwAKGDmVS66IBjD1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Byb91/hyRgkxY9YH/hygJoCcq77KPUEv3VvaTE0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c7oeqP/hyRgh8565p/zJpKKbHKuL5c123mfl6U5K/img.jpg?width=754&amp;amp;height=760&amp;amp;face=0_0_754_760');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Swift) iOS 프로그래밍 함수, 1급객체, 클로저, 클래스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;함수 함수의 타입 (자료형, 자료형, ...) -&amp;gt; 리턴형(Int, Int, ...) -&amp;gt; Int =&amp;gt; 리턴형이 Void형이면 () 함수의 자료형 출력 print(type(of:함수몀)) func sum(num1 x: Int, sum2 y: Int) -&amp;gt; Int { return(x+y) //함수 정의 } sum(num1:&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yejprogramming.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 또한 고차함수 이해를 위해서는 클로저를 공부하는 것이 바람직하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 매우매우매우 자주 쓰이는 &amp;nbsp;map, filter, reduce 함수에 대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;map(_:)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Returns an array containing the results of mapping the given closure over the sequence&amp;rsquo;s elements.&lt;br /&gt;시퀀스의 요소를 순회하며 클로저에 매핑한 결과를 포함하는 배열을 반환한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;놀랍게도 이 한 줄의 설명만 봐서는 무슨 말인지 하나도 모르겠다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map은 컨테이너 내부에 기존 데이터를 변형(transform)하여 새로운 컨테이너를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 컨테이너를 만들기 때문에 기존 데이터는 변형되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sequence, collection 프로토콜을 따르는 타입과 옵셔널은 모두 해당 함수를 사용할 수 있다. (array, dictionary, set, optional)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map은 for-in 구문 비슷한데. map을 사용하는 이유는 바로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 간결성, 재사용 용이성, 컴파일러 최정화 성능이 좋다는 점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 예시를 한 번 살펴보자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짝수로 이루어진 배열의 각 요소들에 -1을 하여 홀수로 이루어진 배열을 만들어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for-in&lt;/p&gt;
&lt;pre id=&quot;code_1673495808946&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [2,4,6,8,10]
var array2: [Int] = []

for i in array {
    array2.append(i-1)
}

print(array2) // [1, 3, 5, 7, 9]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map&lt;/p&gt;
&lt;pre id=&quot;code_1673496033334&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var oddNumArr = array.map { i -&amp;gt; Int in
    i - 1
}
print(oddNumArr) //[1, 3, 5, 7, 9]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저로 축약해 밑에 처럼 표현할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1673496341491&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var oddNumArr = array.map { $0 - 1 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;filter(_:)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Returns an array containing, in order, the elements of the sequence that satisfy the given predicate.&lt;br /&gt;주어진 조건(predicate)에 만족하는 시퀀스의 요소를 포함하는 배열을 반환한다&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 map은 데이터를 변형하고자 할 때 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filter은 데이터를 추출(filter)하고자 할 때 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map과 마찬가지로 새로운 컨테이너를 만들기 때문에 기존 데이터는 변형되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for-in&lt;/p&gt;
&lt;pre id=&quot;code_1673497620436&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [1,2,3,4,5,6,7,8,9,10]
var array2: [Int] = []

for i in array {
    if i%2==1 {
        array2.append(i)
    }
}

print(array2) // [1, 3, 5, 7, 9]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;filter&lt;/p&gt;
&lt;pre id=&quot;code_1673497781078&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var oddNumArr = array.filter { i -&amp;gt; Bool in
    i%2==1
}
print(oddNumArr) // [1, 3, 5, 7, 9]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;축약&lt;/p&gt;
&lt;pre id=&quot;code_1673497816976&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var oddNumArr = array.filter { $0%2==1 }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;reduce(_:)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Returns the result of combining the elements of the sequence using the given closure.&lt;br /&gt;주어진 클로저를 사용하는 시퀀스의 요소를 결합한 결과를 반환한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reduce는 컨테이너 내부의 요소를 하나로 결합한다. (데이터를 합치기 위해 사용)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675754222140&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let numberArray = [1,2,3,4,5]

var sumFor = 0
for number in numberArray {
    sumFor += number
}

let sumReduce = numberArray.reduce(0) { $0 + $1 }

print(sumFor) //15
print(sumReduce)//15&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://shark-sea.kr/entry/Swift-고차함수-Map-Filter-Reduce-알아보기&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://shark-sea.kr/entry/Swift-고차함수-Map-Filter-Reduce-알아보기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://minosaekki.tistory.com/21&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://minosaekki.tistory.com/21&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jud00.tistory.com/entry/오늘의-Swift-지식-고차-함수-map-filter-reduce&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jud00.tistory.com/entry/오늘의-Swift-지식-고차-함수-map-filter-reduce&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@un1945/Swift-고차함수-Higher-order-Function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@un1945/Swift-고차함수-Higher-order-Function&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://donggyu9410.medium.com/swift-필수-문법-map-filter-reduce-compactmap-9c4c903804a8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://donggyu9410.medium.com/swift-필수-문법-map-filter-reduce-compactmap-9c4c903804a8&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ho8487.tistory.com/22&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ho8487.tistory.com/22&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift이론</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/72</guid>
      <comments>https://yejprogramming.tistory.com/72#entry72comment</comments>
      <pubDate>Sun, 15 Jan 2023 14:53:28 +0900</pubDate>
    </item>
    <item>
      <title>RxSwift 파헤치기 도전! (1)</title>
      <link>https://yejprogramming.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;RxSwift를 이해하기 위해 글을 몇 개 읽었는데 이해하는데 한계가 있어 패스트캠퍼스의 GitHub 앱 만들기 강의를 보며 따라 해보려고 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;face&quot; data-emoticon-name=&quot;055&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/055.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/face/large/055.png&quot; width=&quot;80&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RxSwift는 비동기를 위해 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/69&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yejprogramming.tistory.com/69&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673250491638&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Swift의 비동기 처리&quot; data-og-description=&quot;※해당 글은 Swift 비동기에 관한 다른 블로그 글들을 보고 공부 목적으로 정리하였습니다. 더 자세한 정보를 원할 시 하단의 출처를 보시고 해당 글들을 참고하시길 바랍니다!! Sync vs Async Sync(동&quot; data-og-host=&quot;yejprogramming.tistory.com&quot; data-og-source-url=&quot;https://yejprogramming.tistory.com/69&quot; data-og-url=&quot;https://yejprogramming.tistory.com/69&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPnTDV/hyRdEKUMGt/tbF4GrIF9Kb6eAu8I2Zi81/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/SXsQb/hyRdOGJNDI/0P3Z7SKAtX6W9DYWOfwIAk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/yY4tW/hyRdR4DAcM/lgZ47VvOWrHkYds3XfQrL1/img.jpg?width=754&amp;amp;height=760&amp;amp;face=0_0_754_760&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/69&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yejprogramming.tistory.com/69&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPnTDV/hyRdEKUMGt/tbF4GrIF9Kb6eAu8I2Zi81/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/SXsQb/hyRdOGJNDI/0P3Z7SKAtX6W9DYWOfwIAk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/yY4tW/hyRdR4DAcM/lgZ47VvOWrHkYds3XfQrL1/img.jpg?width=754&amp;amp;height=760&amp;amp;face=0_0_754_760');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Swift의 비동기 처리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;※해당 글은 Swift 비동기에 관한 다른 블로그 글들을 보고 공부 목적으로 정리하였습니다. 더 자세한 정보를 원할 시 하단의 출처를 보시고 해당 글들을 참고하시길 바랍니다!! Sync vs Async Sync(동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yejprogramming.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 어제 비동기에 대한 글을 작성하였는데, 이러한 방식의 비동기 처리는 복잡하고 코드가 지저분하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Rx를 사용하면 코드가 직관적이고 효율적이게 된다고 하는 듯 한데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자랑은 아니지만 사실 아직은 잘 이해가 가지 않는다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rx를 사용하는 이유는 다음과 같다고 한다. -&amp;gt; Composable, Reusable, Declarative, Understandable and concise, Stable, Less Stateful, Without leaks&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/fimuxd/RxSwift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/fimuxd/RxSwift&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673251200152&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - fimuxd/RxSwift: RxSwift를 스터디하는 공간&quot; data-og-description=&quot;RxSwift를 스터디하는 공간. Contribute to fimuxd/RxSwift development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/fimuxd/RxSwift&quot; data-og-url=&quot;https://github.com/fimuxd/RxSwift&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ksu3j/hyRdQYWFnO/KiZ8Br1690VWZOxkSz1UBK/img.png?width=1200&amp;amp;height=600&amp;amp;face=969_159_1044_241&quot;&gt;&lt;a href=&quot;https://github.com/fimuxd/RxSwift&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/fimuxd/RxSwift&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ksu3j/hyRdQYWFnO/KiZ8Br1690VWZOxkSz1UBK/img.png?width=1200&amp;amp;height=600&amp;amp;face=969_159_1044_241');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - fimuxd/RxSwift: RxSwift를 스터디하는 공간&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;RxSwift를 스터디하는 공간. Contribute to fimuxd/RxSwift development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가 깃헙에 Rx에 대해 열심히 설명을 해놓았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책을 보시고 정리한 것 같은데 패스트캠퍼스의 15분짜리 RxSwift 영상과 설명이 유사하지만 내용이 더 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 RxSwift 설치부터 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rx는 cocoaPods로 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 하나 만들고 해당 폴더의 터미널에서&lt;/p&gt;
&lt;pre id=&quot;code_1673253333466&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pod init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 해당 폴더의 Podfile을 켜고&lt;/p&gt;
&lt;pre id=&quot;code_1673253343283&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pod 'RxSwift', '6.5.0'
pod 'RxCocoa', '6.5.0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널로 돌아가서&lt;/p&gt;
&lt;pre id=&quot;code_1673253361214&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pod install&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 뷰 컨트롤러에서 import RxSwift를 해주면 설치 완료이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6qBUu/btrVOAdIO8a/ZQym6o1zgx0HLLrWKW3xp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6qBUu/btrVOAdIO8a/ZQym6o1zgx0HLLrWKW3xp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6qBUu/btrVOAdIO8a/ZQym6o1zgx0HLLrWKW3xp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6qBUu%2FbtrVOAdIO8a%2FZQym6o1zgx0HLLrWKW3xp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>iOS/Swift실전</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/71</guid>
      <comments>https://yejprogramming.tistory.com/71#entry71comment</comments>
      <pubDate>Tue, 10 Jan 2023 09:38:05 +0900</pubDate>
    </item>
    <item>
      <title>Swift 검색 기능, search controller 사용해보기</title>
      <link>https://yejprogramming.tistory.com/70</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;앱에서 중요한 기능인 검색!! Swift에 있는 search controller로 간단하게 구현해 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxbewN/btrVALm4ewN/cGhCLUMEhjJKNE13ZZBtck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxbewN/btrVALm4ewN/cGhCLUMEhjJKNE13ZZBtck/img.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;1760&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.3521%; margin-right: 10px;&quot; data-widthpercent=&quot;50.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxbewN/btrVALm4ewN/cGhCLUMEhjJKNE13ZZBtck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxbewN%2FbtrVALm4ewN%2FcGhCLUMEhjJKNE13ZZBtck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;916&quot; height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjSshS/btrVGZK5Ja2/nmPATPbs8v6kJ8YGebiM7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjSshS/btrVGZK5Ja2/nmPATPbs8v6kJ8YGebiM7k/img.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;1728&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.4851%;&quot; data-widthpercent=&quot;49.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjSshS/btrVGZK5Ja2/nmPATPbs8v6kJ8YGebiM7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjSshS%2FbtrVGZK5Ja2%2FnmPATPbs8v6kJ8YGebiM7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;1728&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;storyboard&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI1qtH/btrVzYmGgHl/skDZwGZPbJEnmpCWTpSajk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI1qtH/btrVzYmGgHl/skDZwGZPbJEnmpCWTpSajk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI1qtH/btrVzYmGgHl/skDZwGZPbJEnmpCWTpSajk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI1qtH%2FbtrVzYmGgHl%2FskDZwGZPbJEnmpCWTpSajk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;1022&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1022&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;navgation과 table view를 연결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 테이블뷰는 tableView라는 이름으로 아웃렛을 만든다.&lt;/p&gt;
&lt;pre id=&quot;code_1673164314584&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@IBOutlet weak var tableView: UITableView!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;viewController.swift&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단, 내가 만든 프로젝트는 배우들의 이름을 배열에 저장하고 그 배열을 테이블뷰로 출력해서 검색할 수 있게 해주는 기능을 담았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;열심히 주석을 단 코드 전체를 첨부하니 설명은 생략!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;전체코드&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673164210903&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    var nameList = [&quot;안재욱&quot;,&quot;안보현&quot;,&quot;이지아&quot;,&quot;이광수&quot;,&quot;이시영&quot;,&quot;원빈&quot;,&quot;오연서&quot;,&quot;김우빈&quot;,&quot;강하늘&quot;,&quot;강소라&quot;,&quot;김아중&quot;,&quot;신하균&quot;,&quot;신세경&quot;,&quot;손예진&quot;,&quot;송일국&quot;,&quot;송지효&quot;,&quot;지진희&quot;,&quot;지창욱&quot;,&quot;최지우&quot;,&quot;최다니엘&quot;,&quot;지성&quot;,&quot;차예련&quot;,&quot;차태현&quot;,&quot;주원&quot;,&quot;조인성&quot;,&quot;손흥민&quot;,&quot;조규성&quot;,&quot;조여정&quot;,&quot;전지현&quot;,&quot;하지원&quot;,&quot;박서준&quot;,&quot;박소담&quot;,&quot;박보영&quot;,&quot;황정민&quot;]
    var filteredList: [String] = []
    //isEditMode일 경우에만 filteredItems를 사용하고, 아닌 경우에는 tableViewItems를 사용하기 위함
    var isEditMode: Bool {
        let searchController = self.navigationItem.searchController
        let isActive = searchController?.isActive ?? false //searchController가 실행되었는지
        let isSearchBarHasText = searchController?.searchBar.text?.isEmpty == false //search bar에 입력된 텍스트가 true:있다, false:없다
        return isActive &amp;amp;&amp;amp; isSearchBarHasText
        //즉 isEditMode의 리턴값이 true일 경우 검색창에 값이 입력된 경우, false면 아무 값도 입력되지 않은 경우
    }
    
    //search controller와 관련된 설정들
    func searchConfigure() {
        let searchController = UISearchController(searchResultsController: nil) //UISearchController 인스턴스 생성. searchResultsController은 검색을 했을 때 보여줄 뷰컨트롤러이다.
        self.navigationItem.searchController = searchController//네비게이션 아이템의 searchController 프로퍼티에 위에서 만든 searchController 인스턴스를 할당한다.
        searchController.searchBar.placeholder = &quot;검색&quot;
        searchController.hidesNavigationBarDuringPresentation = true //검색창을 터치했을 때 네비게이션바를 보여줄지 설정
        searchController.navigationItem.hidesSearchBarWhenScrolling = false //스크린을 밑으로 내렸을 때 검색창을 상단에 고정해서 보여줄 것인지 설정
        searchController.searchResultsUpdater = self //updateSearchResults(for:) delegate사용 위한 델리게이트 할당. 중요!
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.nameList.sort()
        tableView.dataSource = self
        self.searchConfigure()

        navigationItem.title = &quot;검색기능&quot;
    }
}

extension ViewController: UISearchResultsUpdating {
    //search controller의 델리게이트 준수
    func updateSearchResults(for searchController: UISearchController) {
        //search bar에 텍스트 입력될 때 마다 업데이트 되는 메서드
        guard let text = searchController.searchBar.text?.lowercased() else { return }
        //contains 메서드: 조예진이면 조, 조예, 조예진 검색해야함, hasPrefix: 조예진이면 예, 진, 예진, 조예 등 검색어가 포함된 결과는 다 나옴
        //lowercased: 문자열 전체를 소문자로 만듦
        self.filteredList = self.nameList.filter { $0.lowercased().contains(text) }
        //텍스트가 입력될 때 마다다 테이블 뷰리로드를 해줌
        self.tableView.reloadData()
        //dump(filteredItems)
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&amp;gt; Int {
        return self.isEditMode ? self.filteredList.count : self.nameList.count //isEditMode 값이 true이면 filteredItems.count를 반환, 아니면 tableViewItems.count를 반환한다.
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&amp;gt; UITableViewCell {
        let cell = UITableViewCell()
        if self.isEditMode {
            cell.textLabel?.text = self.filteredList[indexPath.row]
        } else {
            cell.textLabel?.text = self.nameList[indexPath.row]
        }
        return cell
    }
    
    
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>iOS/Swift실전</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/70</guid>
      <comments>https://yejprogramming.tistory.com/70#entry70comment</comments>
      <pubDate>Mon, 9 Jan 2023 18:04:15 +0900</pubDate>
    </item>
    <item>
      <title>Swift의 비동기 처리</title>
      <link>https://yejprogramming.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;※해당 글은 Swift 비동기에 관한 다른 블로그 글들을 보고 공부 목적으로 정리하였습니다. 더 자세한 정보를 원할 시 하단의 출처를 보시고 해당 글들을 참고하시길 바랍니다!!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Sync vs Async&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sync(동기)&lt;/p&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;li&gt;코드 작성 순서대로 호출&lt;/li&gt;
&lt;li&gt;주어진 작업이 완료될 때 까지 다음 작업으로 넘어가지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Async(비동기)&lt;/p&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;li&gt;주어진 작업의 완료 여부와 관계 없이 작업 전달 후 바로 다음 작업으로 넘어감&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Serial vs Concurrent&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Serial(직렬)&lt;/p&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;li&gt;할 일을 하나의 스레드에 차곡차곡 순서대로 쌓는 것&lt;/li&gt;
&lt;li&gt;DisaptchQueue.main()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Concurrent(동시)&lt;/p&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;li&gt;할 일을 여러 스레드에 마구잡이로 분산 배치하는 것&lt;/li&gt;
&lt;li&gt;DispatchQueue.global()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;4가지 조합&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Serial 큐 + sync&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DispatchQueue.main.sync{}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 iOS 프로그래밍에서는 사용 금지(deadlock 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Serial 큐 + async&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;DispatchQueue.main.async{}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 스레드로 작업을 전달하지만 &lt;u&gt;완료를 기다리지 않는다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Serial 큐이기에 작업을 하나의 스레드에 작업을 순서대로 전달하고 async 메서드이므로 완료를 기다리지 않고 곧 바로 다른 작업을 진행시킨다. 주로 ui 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Concurrent 큐 + sync&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;DispatchQueue.global().sync{}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 여러 스레드로 작업 분산 배치, 배치한 작업들이 모두 완료될 때 까지 이전 스레드를 블락하고 기다린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Concurrent 큐니까 작업을 분산 배치하고 sync 메서드이므로 완료를 기다리는 것. 자주 사용되지는 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Concurrent 큐 + async&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;DispatchQueue.global().async{}&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 다른 여러 스레드로 분산 배치하되 완료를 기다리지는 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Concurrent 큐니까 작업을 분산 배치하고, async 메서드이므로 완료를 기다리지 않는다. 주로 api 통신 등에 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Swift에서의 비동기 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 대표적인 처리 방식은 GCD(Grand Central Dispatch)라는 API&lt;/li&gt;
&lt;li&gt;GCD : Queue(Dispatch Queue)에 작업을 보내면 이에 맞춰 스레드를 적절히 생성해 분배해주는 역할&lt;/li&gt;
&lt;li&gt;즉, Dispatch Queue에 task 추가하면 GCD가 task에 맞춰 스레드를 자동으로 생성해 실행하고, task가 완료되면 스레드를 제거하는 일련의 과정 관리 //DispatchQueue.global().async{//task}&lt;/li&gt;
&lt;li&gt;DispatchQueue.global().async{//task} //여기서 closure 내부의 task는 하나의 작업 그룹이므로 이는 순차적으로 처리된다.&lt;/li&gt;
&lt;li&gt;sync,async는 task를 보낸 시점에서 작업 완료를 기다릴지 말지를 다루는 것이며, serial,concurrent는 queue에 보내진 작업을 하나의 스레드에만 보낼 건지, 여러 스레드에 보낼건 지를 다룸&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GlobalQueue는 Concurrent의 특성. 해당 큐는 여러 개의 스레드로 task를 분산시. 또한 해당 큐는 DispatchQueue.global(qos: .utility).async[}와 같이 qos(Quality of Service)를 지정함으로 작업의 중요도를 정해줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;QoS의 종류 6가지&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;userInteractive: 사용자와 직접 상호작용하는 작업(aka.ui업데이트,애니메이션)&lt;/li&gt;
&lt;li&gt;userInitiated : 클릭 시 작업 수행하는 것과 같은 즉각적 결과가 필요한 작업(aka.저장된 문서 열기)&lt;/li&gt;
&lt;li&gt;default : 기본값&lt;/li&gt;
&lt;li&gt;utility: progress bar과 함께 길게 실행되는 작업(aka.데이터 다운로드)&lt;/li&gt;
&lt;li&gt;background: 유저가 직접적으로 인지하지 않는 등 시가이 덜 중요한 작업 (aka. 동기화 및 백업)&lt;/li&gt;
&lt;li&gt;unspecified : qos 정보 없음 (aka.거의 사용X)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CustomQueue: 사용자가 직접 만드는 큐이므로 디폴트로는 Serial 특성이지만 Concurrent로 변경 가능, QoS 설정도 가능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성 시 매개변수 label을 붙이면 customQueue가 되며 추자적으로 attributes나 qos등 매개변수 사용하면 특성과 qos 설정 변경도 가능&lt;/li&gt;
&lt;li&gt;Ex. let custom = DispatchQueue(label: &amp;ldquo;something&amp;rdquo;, qos: .background, attributes: .concurrent)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Async, Await은 뭐야???&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 비동기 처리 방식은 DispatchQueue나 completionHandler 사용해 처리했지만, 더욱 편하게 비동기 처리할 수 있는 문법!&lt;/li&gt;
&lt;li&gt;Async 키워드는 비동기 task 정의 (위에 더 자세한 설명), throws를 같이 쓸 수 있음, 프로토콜에서도 요구 가능&lt;/li&gt;
&lt;li&gt;Await 키워드는 비동기 함수의 실행을 동기화 시킴, 현재 스레드에서 해당 비동기 함수의 실행이 끝날 때 까지 대기, await은 블로킹(blocking) 유발하기 때문에 async로 마크된 비동기 함수 내부에서만 사용 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1673158224878&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Func practiceWhat() async {
&amp;hellip;코드1&amp;hellip;
Try? Await practice()
&amp;hellip;코드2&amp;hellip;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 코드1 실행 중 practice() 실행 시, 해당 작업이 끝날 때 까지 코드2는 실행되지 않음&lt;/li&gt;
&lt;li&gt;한 번에 여러 작업 동시에 실행하고자 할 때 async-let &amp;nbsp;문법의 코드를 작성해 병렬 수행 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[출처]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@wnsxor1993/Swift%EC%9D%98-%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0&quot;&gt;https://velog.io/@wnsxor1993/Swift%EC%9D%98-%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://medium.com/@goehd2538/ios%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%8B%9D-65aa81aad0f9&quot;&gt;https://medium.com/@goehd2538/ios%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%8B%9D-65aa81aad0f9&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ios-development.tistory.com/958&quot;&gt;https://ios-development.tistory.com/958&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://beenii.tistory.com/202&quot;&gt;https://beenii.tistory.com/202&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift이론</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/69</guid>
      <comments>https://yejprogramming.tistory.com/69#entry69comment</comments>
      <pubDate>Sun, 8 Jan 2023 15:11:32 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] array! 배열에 대해 파헤쳐보자!</title>
      <link>https://yejprogramming.tistory.com/68</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Swift의 컬렉션 타입에는 배열, 딕셔너리, 세트가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 중에서 오늘은 배열에 대해 한 번 자세히 알아보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열[array]은 &quot;같은 타입&quot;의 데이터들을 &quot;순서&quot;에 맞춰 저장하는 타입이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 생성은 다음과 같이 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1672208430707&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array : Array&amp;lt;Int&amp;gt; = Array&amp;lt;Int&amp;gt;()
var array2 : = [Int]()
var array3 : [Int] = []&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 알아야 할 점!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 위 코드와 같이 빈 배열을 생성할 경우에는 배열의 타입을 명시해야 하지만, 값을 넣어서 배열을 만들 경우에는 타입을 명시하지 않아도 된다. 그런 경우는 밑의 코드 처럼 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1672208624117&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [100, 200, 300]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 하나의 배열에는 같은 타입의 데이터들만 있을 수 있다. 고로 밑의 코드는 잘못된 예시이다.&lt;/p&gt;
&lt;pre id=&quot;code_1672208723483&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array [1, 30.0, &quot;apple&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 배열에도 상수형 배열, 변수형 배열이 있다. (let array, var array)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어려울 것 없는 배열!! 이제 이걸 어떻게 가지고 놀 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* array의 요소들을 순서대로 쭈욱 출력하고 싶다면? for in문을 돌리면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1672209354209&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [3,4,10,5]
var num = 1
for elements in array {
    print(num, &quot;:&quot;, elements)
    num += 1
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 앱을 만들다보면, array에 값을 넣어야 하는 일이 굉장히 많이 있는데, 이 때 array에 값이 잘 들어갔는지, array가 빈 값은 아닐 지를 알 고 싶다면? &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;isEmpty&lt;/span&gt;&lt;/b&gt; 프로퍼티를 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1672209593362&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var array = [3,4,10,5]

if array.isEmpty {
    print(&quot;array가 빈 배열입니다&quot;)
} else {
    print(array)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; if는 조건문이 true일 때 실행되는거 다들 아시죠? 즉, isEmpty는 true 혹은 false를 나타냅니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 배열의 첫번째 요소와 마지막 요소를 알고 싶을 때는 &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;first, last 프로퍼티&lt;/span&gt;&lt;/b&gt;를 사용하라!, 이 때 값은 옵셔널이기 때문에 언래핑을 해줘야 한다. 이 때, 만약 배열이 비었을 경우에는 nil을 출력한다&lt;/p&gt;
&lt;pre id=&quot;code_1672210990695&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let array = [3,4,10,5]

print(array.first, array.last) //Optional(3), Optional(5)

if let arrayFirst = array.first, let arrayLast = array.last { 
    print(arrayFirst, arrayLast, separator: &quot;, &quot;) //3, 5
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 배열에 요소를 추가하고 싶을 때 : &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;append&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672211346562&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var family = [&quot;mom&quot;, &quot;dad&quot;]
family.append(&quot;sister&quot;)
family.append(contentsOf: [&quot;grandma&quot;,&quot;grandpa&quot;])
print(family) //[&quot;mom&quot;, &quot;dad&quot;, &quot;sister&quot;, &quot;grandma&quot;, &quot;grandpa&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 특정 인덱스에 요소를 추가, 삭제하고 싶을 때, &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;insert, remove &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 꼭 필요한 경우가 아니라면 insert 보다는 append를 사용하자&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672211633064&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var numbers = [3,4,0,10,60]
numbers.insert(100, at: 4)//[3, 4, 0, 10, 100, 60]
numbers.remove(at: 3)//[4, 0, 10, 100, 60]
numbers.removeFirst() //[4, 0, 100, 60]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 배열의 요소를 검색하고 싶다면? &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;contains&lt;/span&gt;&lt;/b&gt; 메서드로 해당 값이 배열의 요소 중에 있는지 확인이 가능하다!&lt;/p&gt;
&lt;pre id=&quot;code_1672213156546&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var numbers = [3,4,0,10,60]
numbers.contains(10) //true
numbers.contains(2) //false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 배열을 오름차순, 내림차순 정렬하고 싶을 때는? &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;sort(), sorted()&lt;/span&gt;&lt;/b&gt;를 기억하자!&lt;/p&gt;
&lt;pre id=&quot;code_1672213312387&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var numbers = [3,4,0,10,60]
numbers.sort() //[0, 3, 4, 10, 60]
numbers.sort(by:&amp;gt;) //[60, 10, 4, 3, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort는 바로 배열에 사용해주면 오름차순, 내림차순으로 정렬된 배열을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 같은 방법으로 sorted를 사용하고 numbers를 출력하면 값이 변경되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 바로, sort는 원본 데이터를 변경하는 것이고 sorted는 정렬된 새로운 배열을 리턴하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, numbers.sorted()를 하고 그대로 numbers를 출력하면 원본이 유지가 된다. 그렇기 때문에 이를 사용하고 싶다면 새로운 변수(상수) 배열에 이 값을 저장해서 사용하여야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1672213532911&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var numbers = [3,4,0,10,60]
var newNumbers = numbers.sorted()
print(newNumbers)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 배열을 무작위로 섞고 싶을 때는 &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;shuffle()&lt;/span&gt;&lt;/b&gt;을 기억하자! 여담이지만 예전에 이게 시험에 나왔는데 기억이 안나서 array.random()이라고 적은 흑역사가 있다 ( ... )&lt;/p&gt;
&lt;pre id=&quot;code_1672213639455&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var numbers = [3,4,0,10,60]
numbers.shuffle() //[4, 60, 10, 0, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 배열의 길이를 알고 싶을 때는 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;count 프로퍼티&lt;/b&gt;&lt;/span&gt;가 있다. 예시 생략&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 어떤 데이터가 배열의 몇 번 째 인덱스에 처음/마지막에 있는 지 알고 싶을 때! &lt;b&gt;&lt;span style=&quot;color: #f3c000;&quot;&gt;firstIndex(of:), lastIndex(of:)&lt;/span&gt;&lt;/b&gt; 메서드가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1672213938659&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var numbers = [3,4,0,10,60,50,4,4]
numbers.firstIndex(of:4) //Optional(1)
numbers.lastIndex(of:4) //Optional(7)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 글은 배열에 관해 제가 더 적고 싶은 내용이 생길 때 더 수정해가겠습니다  &lt;/p&gt;</description>
      <category>iOS/Swift이론</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/68</guid>
      <comments>https://yejprogramming.tistory.com/68#entry68comment</comments>
      <pubDate>Wed, 28 Dec 2022 16:56:02 +0900</pubDate>
    </item>
    <item>
      <title>[Swift/iOS프로그래밍] 뷰와 뷰 사이 데이터 전달</title>
      <link>https://yejprogramming.tistory.com/65</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 화면전환 네비게이션 글에서 실습한 프로젝트 이후 부분이니 참고바람&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yejprogramming.tistory.com/62&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1653470902946&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[swift/iOS프로그래밍] navigation controller 4가지 방법, 세그 vs 코드,push vs present&quot; data-og-description=&quot;스위프트로 화면전환을 구현하는 방식 중에 네비게이션 컨트롤러가 있다. 세그로 구현하는 것과 코드로 구현하는 것이 있는데 이 중에서도 푸쉬와 프레젠트라는 방식이 있다. 오늘은 이런 4가&quot; data-og-host=&quot;yejprogramming.tistory.com&quot; data-og-source-url=&quot;https://yejprogramming.tistory.com/62&quot; data-og-url=&quot;https://yejprogramming.tistory.com/62&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/iijxO/hyOxtZpf0A/EzD3IJ7xLaOLeNCfWpk8Lk/img.png?width=800&amp;amp;height=710&amp;amp;face=0_0_800_710,https://scrap.kakaocdn.net/dn/KGvzy/hyOxqhi8wQ/teB8zsde8XXUWJh5KA5fA0/img.png?width=800&amp;amp;height=710&amp;amp;face=0_0_800_710,https://scrap.kakaocdn.net/dn/YlkQU/hyOxqO9VZI/Dkt21481ivqgzAUTxPwA0K/img.png?width=1110&amp;amp;height=986&amp;amp;face=0_0_1110_986&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yejprogramming.tistory.com/62&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/iijxO/hyOxtZpf0A/EzD3IJ7xLaOLeNCfWpk8Lk/img.png?width=800&amp;amp;height=710&amp;amp;face=0_0_800_710,https://scrap.kakaocdn.net/dn/KGvzy/hyOxqhi8wQ/teB8zsde8XXUWJh5KA5fA0/img.png?width=800&amp;amp;height=710&amp;amp;face=0_0_800_710,https://scrap.kakaocdn.net/dn/YlkQU/hyOxqO9VZI/Dkt21481ivqgzAUTxPwA0K/img.png?width=1110&amp;amp;height=986&amp;amp;face=0_0_1110_986');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[swift/iOS프로그래밍] navigation controller 4가지 방법, 세그 vs 코드,push vs present&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스위프트로 화면전환을 구현하는 방식 중에 네비게이션 컨트롤러가 있다. 세그로 구현하는 것과 코드로 구현하는 것이 있는데 이 중에서도 푸쉬와 프레젠트라는 방식이 있다. 오늘은 이런 4가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yejprogramming.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;▼실습 완료 화면&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 구현한 네비게이션 컨트롤러 부분에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Push 부분은 첫번째 뷰컨트롤러(루트컨트롤러)에서 두번째 컨트롤러로 데이터 전달,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Present 부분은 delegate으로 두번째 뷰컨트롤러에서 첫번째 컨트롤러로 데이터 전달을 구현했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Segue로 네비게이션 화면전환을 한 경우는 SeguePushViewController에서 첫번째 뷰컨트롤러에서 두번째 뷰컨트롤러로 데이터 전달이 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 전달 부분의 코드는 각 문장 마다 주석을 상세하게 달아두었으니 참고 바람!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ViewController.swift&lt;/p&gt;
&lt;pre id=&quot;code_1653470966904&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class ViewController: UIViewController, SendDataDelegate { // CodePresentViewController에 있는 sendDataDelegate 채택

    @IBOutlet weak var nameLb: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
    }

    //첫번째 뷰에서 두번째 뷰로 데이터 넘겨주기
    @IBAction func codePushBtn(_ sender: UIButton) {
        guard let viewController = self.storyboard?.instantiateViewController(identifier:&quot;codePushViewController&quot;) as? CodePushViewController else { return } //이렇게 뷰컨트롤러로 다운캐스팅하면 CodePushViewController에 있는 프로퍼티들에 접근 가능함
        viewController.name = &quot;YejProgramming&quot; //다운캐스팅을 했기 때문에 이렇게 codePushViewController에 있는 name 변수에 값을 지정할 수 있음. 아무튼, ViewController에서 name 변수에 저장된 YejProgramming이라는 단어는 실행시 두번째 뷰인 CodePushViewController에서 확인 가능함
        self.navigationController?.pushViewController(viewController, animated: true)
    }
    
    //두번째 뷰에서 첫번째 뷰로 데이터 넘겨주기
    @IBAction func codePresentBtn(_ sender: UIButton) {
        guard let viewController = self.storyboard?.instantiateViewController(identifier: &quot;codePresentViewController&quot;) as? CodePresentViewController else { return } //여기서 CodePresentViewController을 다운캐스팅해줌으로써 delegate을 위임받을 수 있음
        viewController.modalPresentationStyle = .fullScreen        
        viewController.delegate = self //delegate 위임
        self.present(viewController, animated: true, completion: nil)
        
    }
    
    //세그웨이를 실행하기 직전에 시스템에 의해 오버라이드된 prepare 메서드가 자동으로 호출됨
    //이 prepare메서드 안에 전환하려는 뷰컨트롤러의 인스턴스를 가져오자
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        //segue.destination propertyd을 이용해 전환하려는 뷰 컨트럴로의 인스턴스를 가져올 수 있음
        if let viewController = segue.destination as? SeguePushViewController {
            viewController.name = &quot;YejProgrammingSegue&quot;
        }
    }
    
    //프로토콜 준수
    func sendData(name: String) {
        self.nameLb.text = name //여기서 name은 CodePresentViewController에서 정의한 &quot;YejProgramming 이전 뷰로 데이터 넘겨주기 실습&quot;이다.
        self.nameLb.sizeToFit()
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CodePushViewController.swfit&lt;/p&gt;
&lt;pre id=&quot;code_1653471020673&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class CodePushViewController: UIViewController {

    @IBOutlet weak var nameLb: UILabel!
    var name: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let name = name {
            //optional binding
            self.nameLb.text = name //여기서 name은 앞에 viewController에서 지정한 &quot;YejPromming&quot;임
            self.nameLb.sizeToFit() //라벨 길이가 텍스트 길이에 맞도록 조절
        }
        
    }

    @IBAction func backBtn(_ sender: Any) {
        self.navigationController?.popViewController(animated: true)
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CodePresentViewController.swift&lt;/p&gt;
&lt;pre id=&quot;code_1653471043658&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mport UIKit

protocol SendDataDelegate: AnyObject {
    func sendData(name: String) //name이라는 파라미터를 넘김
}

class CodePresentViewController: UIViewController {


    weak var delegate: SendDataDelegate? //delegate 패턴을 사용할 때 변수 앞에 weak를 붙여야 함. 메모리 누수 발생할 수 있기 때문. 이렇게 delegate 변수 선언이 완료되면 위임할 준비가 완료됨
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func backBtn(_ sender: UIButton) {
        self.delegate?.sendData(name: &quot;YejProgramming 이전 뷰로 데이터 넘겨주기 실습&quot;) //데이터를 전달받은 뷰컨트롤러에서 sendData delegate protocol을 채택하고 delegate을 위임받을 수 있음
        self.presentingViewController?.dismiss(animated: true, completion: nil)
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeguePushViewController.swift&lt;/p&gt;
&lt;pre id=&quot;code_1653471060503&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class SeguePushViewController: UIViewController {
    @IBOutlet weak var nameLb: UILabel!
    var name: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if let name = name {
            self.nameLb.text = name //여기서 named은 ViewController에서 정의한 YejProgrammingSegue
            self.nameLb.sizeToFit()
        }
    }
    
    @IBAction func backBtn(_ sender: UIButton) {
        //백 버튼 클릭 시 이전화면 이동
        self.navigationController?.popViewController(animated: true)
        //백 버튼 클릭 시 처음화면(루트 뷰) 이동
        self.navigationController?.popToRootViewController(animated: true)
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>iOS/Swift실전</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/65</guid>
      <comments>https://yejprogramming.tistory.com/65#entry65comment</comments>
      <pubDate>Wed, 25 May 2022 18:37:47 +0900</pubDate>
    </item>
    <item>
      <title>[Swift/iOS프로그래밍] 뷰 사이클과 관련된 메서드들</title>
      <link>https://yejprogramming.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;viewDidLoad() : 뷰 컨트롤러의 모든 뷰들이 메모리에 로드됐을 때 호출, 처음 한 번만! -&amp;gt; 라이프사이클에서 딱 한 번만 호출될 내용만 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;viewWillAppear : 뷰가 뷰 계층에 추가되고, 화면에 보이기 직전에 매 번 호출, 즉 다른 뷰로 이동했다가 돌아올 때도 재호출됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;viewDidAppear() : 뷰 컨트롤러의 뷰가 뷰 계층에 추가된 후 호출, 주로 뷰가 나타날 때 필요한 추가 작업이나 애니메이션을 시작하는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;viewWillDisappear() : 뷰 컨트롤러의 뷰가 뷰 계층에서 사라지기 전 호출, 뷰가 생성된 뒤 작업한 내용 되돌리는 작업, 최종적으로 데이터 저장하는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;viewDidDisappear() : 뷰 컨트롤러의 뷰가 뷰 계층에서 사라진 뒤 호출, 뷰가 사라지는 것과 관련된 추가 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift실전</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/64</guid>
      <comments>https://yejprogramming.tistory.com/64#entry64comment</comments>
      <pubDate>Wed, 25 May 2022 17:28:47 +0900</pubDate>
    </item>
    <item>
      <title>인증 쿠키값 속이기 &amp;amp; 코드 품질</title>
      <link>https://yejprogramming.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹이 동작하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 서버에 로그인을 함 -&amp;gt; 서버에서 DB를 확인함 -&amp;gt; 사용자가 확인이 되면 클라이언트에게 세션 ID 발급 -&amp;gt; 사용자는 세션ID를 쿠키에 저장 -&amp;gt; 쿠키로 다시 서버에 접속 -&amp;gt; 서버에서 쿠키 검증을 하고 사용자에게 세션을 줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9JNS/btrC4iiiV6i/Cul8Ikry50sL2FzLCtF4kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9JNS/btrC4iiiV6i/Cul8Ikry50sL2FzLCtF4kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9JNS/btrC4iiiV6i/Cul8Ikry50sL2FzLCtF4kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9JNS%2FbtrC4iiiV6i%2FCul8Ikry50sL2FzLCtF4kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;344&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키와 세션의 차이점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키는 클라이언트에 저장, 텍스트 형식, 브라우저 종료시 소멸, 한 도메인에 20개, 쿠키당 4kd, 총 300개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 서버에 저장됨, 오브젝트 형식, 정확한 만료기한 알 수 없음, 서버가 허용하는 한 용량 제한x&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 실습 : 인증 쿠키값을 이용해 다른 사용자의 쿠키를 이용해서 정보 가져오기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증쿠키값 속이기?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z1L4M/btrC2glHCYA/YujGEQ2HT8dPIklO4o0UYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z1L4M/btrC2glHCYA/YujGEQ2HT8dPIklO4o0UYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z1L4M/btrC2glHCYA/YujGEQ2HT8dPIklO4o0UYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ1L4M%2FbtrC2glHCYA%2FYujGEQ2HT8dPIklO4o0UYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;817&quot; height=&quot;470&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfdFl6/btrC3L572jc/rLv3zkDKEQ3L5RtFU8Zw11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfdFl6/btrC3L572jc/rLv3zkDKEQ3L5RtFU8Zw11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfdFl6/btrC3L572jc/rLv3zkDKEQ3L5RtFU8Zw11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfdFl6%2FbtrC3L572jc%2FrLv3zkDKEQ3L5RtFU8Zw11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;510&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqvho5/btrC3dhwTsp/dyuWJO3obfpxpWE2ADthv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqvho5/btrC3dhwTsp/dyuWJO3obfpxpWE2ADthv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqvho5/btrC3dhwTsp/dyuWJO3obfpxpWE2ADthv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqvho5%2FbtrC3dhwTsp%2FdyuWJO3obfpxpWE2ADthv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;635&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;635&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3sYS/btrC4O86Myi/olRSSj1gRJoSYUCBwNYlB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3sYS/btrC4O86Myi/olRSSj1gRJoSYUCBwNYlB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3sYS/btrC4O86Myi/olRSSj1gRJoSYUCBwNYlB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3sYS%2FbtrC4O86Myi%2FolRSSj1gRJoSYUCBwNYlB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;330&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJAq9T/btrC2DGYaQx/IqkoUQW7LugVLmUkSXAWaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJAq9T/btrC2DGYaQx/IqkoUQW7LugVLmUkSXAWaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJAq9T/btrC2DGYaQx/IqkoUQW7LugVLmUkSXAWaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJAq9T%2FbtrC2DGYaQx%2FIqkoUQW7LugVLmUkSXAWaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;345&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLxPI/btrC6HuFloS/OTZippjKrWVsjlBHwEPoFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLxPI/btrC6HuFloS/OTZippjKrWVsjlBHwEPoFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLxPI/btrC6HuFloS/OTZippjKrWVsjlBHwEPoFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLxPI%2FbtrC6HuFloS%2FOTZippjKrWVsjlBHwEPoFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;687&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4gd0h/btrC3Nv412l/ercpkQDcawVSmX20wkObC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4gd0h/btrC3Nv412l/ercpkQDcawVSmX20wkObC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4gd0h/btrC3Nv412l/ercpkQDcawVSmX20wkObC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4gd0h%2FbtrC3Nv412l%2FercpkQDcawVSmX20wkObC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;230&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 품질(Code Quality)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드품질공격이란? 공격에 유용한 정보를 검색해 이를 획득, 이용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해킹에서는 코드 품질이 낮다는건 중요한 내용을 코드에 남겨두는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 유지 보수 용이 위해 주석에 소스에 대한 정보 남기는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>정보보안</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/63</guid>
      <comments>https://yejprogramming.tistory.com/63#entry63comment</comments>
      <pubDate>Wed, 25 May 2022 11:20:26 +0900</pubDate>
    </item>
    <item>
      <title>[Swift/iOS프로그래밍] navigation controller 4가지 방법, 세그 vs 코드,push vs present</title>
      <link>https://yejprogramming.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위프트로 화면전환을 구현하는 방식 중에 네비게이션 컨트롤러가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그로 구현하는 것과 코드로 구현하는 것이 있는데 이 중에서도 푸쉬와 프레젠트라는 방식이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 이런 4가지 방식에 대한 포스팅을 해볼 예정!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▼ 실습 후 완성 화면&lt;/p&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.00.33.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sAqWk/btrCXlNDtbI/qsuJ3zSjB0Zdx3FzItJqG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sAqWk/btrCXlNDtbI/qsuJ3zSjB0Zdx3FzItJqG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sAqWk/btrCXlNDtbI/qsuJ3zSjB0Zdx3FzItJqG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsAqWk%2FbtrCXlNDtbI%2FqsuJ3zSjB0Zdx3FzItJqG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1110&quot; height=&quot;986&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.00.33.png&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네비게이션 컨트롤러를 추가해주고 뷰컨트롤러에 세그 연결을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네비게이션 기능을 구현해줄 각각의 버튼도 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.01.05.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KYYvP/btrCW032tJ0/SH1o3t4PpFTQqkkfGoGl8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KYYvP/btrCW032tJ0/SH1o3t4PpFTQqkkfGoGl8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KYYvP/btrCW032tJ0/SH1o3t4PpFTQqkkfGoGl8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKYYvP%2FbtrCW032tJ0%2FSH1o3t4PpFTQqkkfGoGl8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;978&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.01.05.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 4개의 실습을 할 것이라고 했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세그 연결로 네비게이션을 구현하는 뷰 컨트롤러 두 개와, 코드로 구현할 뷰 컨트롤러 두 개이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단, Push와 Present 화면 전환 동작하는 모습이 다른데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Push는 방향이 가로(왼쪽-&amp;gt;오른쪽), Presents는 세로(아래-&amp;gt;위)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Push는 스택 형식이라 여러 뷰가 쌓일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 세그로 푸쉬하는 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.04.33.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo9Gbg/btrCY5DmCxU/Hkr5MOSMnwcFCD5riMRy9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo9Gbg/btrCY5DmCxU/Hkr5MOSMnwcFCD5riMRy9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo9Gbg/btrCY5DmCxU/Hkr5MOSMnwcFCD5riMRy9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo9Gbg%2FbtrCY5DmCxU%2FHkr5MOSMnwcFCD5riMRy9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;532&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.04.33.png&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼과 컨트롤러를 세그로 연결해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ctrl 누르고 커서를 끌어서 연결 or 오른쪽 마우스 끌어서 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.05.06.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6aAV/btrC0Na7MTv/aEaobpGuYCopYYxuGk7sB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6aAV/btrC0Na7MTv/aEaobpGuYCopYYxuGk7sB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6aAV/btrC0Na7MTv/aEaobpGuYCopYYxuGk7sB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6aAV%2FbtrC0Na7MTv%2FaEaobpGuYCopYYxuGk7sB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.05.06.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Action Segue에 show로 연결해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이러면 완성이다! 버튼을 클릭하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653361393119&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class SeguePushViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func backBtn(_ sender: UIButton) {
        //백 버튼 클릭 시 이전화면 이동
        self.navigationController?.popViewController(animated: true)
        //백 버튼 클릭 시 처음화면(루트 뷰) 이동
        self.navigationController?.popToRootViewController(animated: true)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 세그로 프레젠트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.05.15.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6OO6C/btrCW1hEvw8/cftQHFTQxkKqGRS1syXKw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6OO6C/btrCW1hEvw8/cftQHFTQxkKqGRS1syXKw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6OO6C/btrCW1hEvw8/cftQHFTQxkKqGRS1syXKw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6OO6C%2FbtrCW1hEvw8%2FcftQHFTQxkKqGRS1syXKw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;552&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.05.15.png&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.05.30.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cygwRX/btrCWMrux1P/1sGsRbd7qiGsKqxai6l6T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cygwRX/btrCWMrux1P/1sGsRbd7qiGsKqxai6l6T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cygwRX/btrCWMrux1P/1sGsRbd7qiGsKqxai6l6T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcygwRX%2FbtrCWMrux1P%2F1sGsRbd7qiGsKqxai6l6T0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.05.30.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1653361432230&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class SeguePresentViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func backBtn(_ sender: UIButton) {
        self.presentingViewController?.dismiss(animated: true, completion: nil)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 코드로 푸쉬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ 코드로 프레젠트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.39.09.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QlTmY/btrCZREUTiZ/cWcKTPq9Xy8lAJq6V42y21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QlTmY/btrCZREUTiZ/cWcKTPq9Xy8lAJq6V42y21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QlTmY/btrCZREUTiZ/cWcKTPq9Xy8lAJq6V42y21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQlTmY%2FbtrCZREUTiZ%2FcWcKTPq9Xy8lAJq6V42y21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;978&quot; data-filename=&quot;스크린샷 2022-05-24 오후 12.39.09.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1653363626272&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
       
    }

    @IBAction func codePushBtn(_ sender: UIButton) {
        guard let viewController = self.storyboard?.instantiateViewController(identifier:&quot;codePushViewController&quot;) else { return }
        self.navigationController?.pushViewController(viewController, animated: true)
    }
    
    @IBAction func codePresentBtn(_ sender: UIButton) {
        guard let viewController = self.storyboard?.instantiateViewController(identifier: &quot;codePresentViewController&quot;) else { return }
        viewController.modalPresentationStyle = .fullScreen
        self.present(viewController, animated: true, completion: nil)
        
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음글 : 데이터 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yejprogramming.tistory.com/65&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1653471489544&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Swift/iOS프로그래밍] 뷰와 뷰 사이 데이터 전달&quot; data-og-description=&quot;지난 화면전환 네비게이션 글에서 실습한 프로젝트 이후 부분이니 참고바람 https://yejprogramming.tistory.com/62 [swift/iOS프로그래밍] navigation controller 4가지 방법, 세그 vs 코드,push vs present 스위..&quot; data-og-host=&quot;yejprogramming.tistory.com&quot; data-og-source-url=&quot;https://yejprogramming.tistory.com/65&quot; data-og-url=&quot;https://yejprogramming.tistory.com/65&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QHnsn/hyOxuRyKmp/VjHXAZ6YCKKgIPukiR8CM0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bmMemg/hyOxkVIuzE/TfoAHtHtE73wl0n1CwZBk0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/NCy4Y/hyOxujIKNH/HADqEOekW89mBMjGcHYYrK/img.png?width=750&amp;amp;height=666&amp;amp;face=0_0_750_666&quot;&gt;&lt;a href=&quot;https://yejprogramming.tistory.com/65&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yejprogramming.tistory.com/65&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QHnsn/hyOxuRyKmp/VjHXAZ6YCKKgIPukiR8CM0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bmMemg/hyOxkVIuzE/TfoAHtHtE73wl0n1CwZBk0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/NCy4Y/hyOxujIKNH/HADqEOekW89mBMjGcHYYrK/img.png?width=750&amp;amp;height=666&amp;amp;face=0_0_750_666');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Swift/iOS프로그래밍] 뷰와 뷰 사이 데이터 전달&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;지난 화면전환 네비게이션 글에서 실습한 프로젝트 이후 부분이니 참고바람 https://yejprogramming.tistory.com/62 [swift/iOS프로그래밍] navigation controller 4가지 방법, 세그 vs 코드,push vs present 스위..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yejprogramming.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS/Swift실전</category>
      <author>Sweetft</author>
      <guid isPermaLink="true">https://yejprogramming.tistory.com/62</guid>
      <comments>https://yejprogramming.tistory.com/62#entry62comment</comments>
      <pubDate>Tue, 24 May 2022 12:40:35 +0900</pubDate>
    </item>
  </channel>
</rss>