<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BeanKhaners</title>
    <link>https://beankhan.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Mon, 13 Apr 2026 11:32:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>beankhan</managingEditor>
    <image>
      <title>BeanKhaners</title>
      <url>https://t1.daumcdn.net/cfile/tistory/271CC23857946E1D2E</url>
      <link>https://beankhan.tistory.com</link>
    </image>
    <item>
      <title>OperationQueue suspend 상태에서 AsyncOperation 사용 시 Crash 현상</title>
      <link>https://beankhan.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Crash Log&lt;/h3&gt;
&lt;pre id=&quot;code_1666429659694&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [3557]
Triggered by Thread:  0
Thread 0 name:
Thread 0 Crashed:
0   Foundation                      0x000000018b10777c __NSOQSchedule + 252 (NSOperation.m:285)
1   Foundation                      0x000000018b1076ec __NSOQSchedule + 108 (NSOperation.m:1766)
2   Foundation                      0x000000018b109344 __addOperations + 936 (NSOperation.m:2604)&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;재현 조건&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. OperationQueue 와 AsyncOperation 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. OperationQueue 가 suspend 된 상태에서 cancelAllOperation 호출&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1666429960045&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Operation Queue

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1666429901368&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;internal class AsyncOperation: Operation {
    
    //MARK: - Property Override
    override var isAsynchronous: Bool {
        return true
    }
    
    override var isExecuting: Bool {
        return self.state == .executing
    }
    
    override var isFinished: Bool {
        return self.state == .finished
    }
    
    private let completion: AsyncOperationCompletion?
    init(completion: AsyncOperationCompletion?) {
        self.completion = completion
        super.init()
    }
    
    //MARK: - Operation State
    enum State {
        case ready, executing, finished
        func keyString() -&amp;gt; String {
            switch self {
            case .ready:
                return &quot;isReady&quot;
            case .executing:
                return &quot;isExecuting&quot;
            case .finished:
                return &quot;isFinished&quot;
            }
        }
    }
    
    private var state = State.ready {
        willSet {
            willChangeValue(forKey: self.state.keyString())
            willChangeValue(forKey: newValue.keyString())
        }
        didSet {
            didChangeValue(forKey: self.state.keyString())
            didChangeValue(forKey: oldValue.keyString())
        }
    }
    
    //MARK: - Operation Job
    override func start() {
        if self.isCancelled {
            self.finishByCancel()
            return
        }
        self.state = .executing
        self.async()
    }
    
    internal func async() {
        //Must Override
        preconditionFailure()
    }
    
    final internal func finishByCancel() {
        self.finish(result: nil,
                    error: AsyncOperationError.cancelled)
    }
    
    final internal func finish(result: Any?,
                               error: Error?) {
        if self.state == .finished {
            return
        }
        
        self.state = .finished
        
        guard let completion = self.completion else {
            return
        }
        
        DispatchQueue.main.async {
            completion(result, error)
        }
    }
    
}&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;h3 data-ke-size=&quot;size23&quot;&gt;현상&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쌓여있는 Operation 들이 cancel 을 받으며&lt;br /&gt;추후 이상 동작하는 현상이 발견&lt;br /&gt;(addOperation 시, isSuspend 시, state 변경 시 crash 발생)&lt;/p&gt;
&lt;p data-sourcepos=&quot;9:1-9:8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;9:1-9:8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;9:1-9:8&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;9:1-9:8&quot; data-ke-size=&quot;size23&quot;&gt;해결&amp;nbsp;&lt;/h3&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;OperationQueue 가 suspend 된 시점에 cancel 을 직접하지 않으면 정상동작한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;따로 cancel method 를 상속받지 않도록 하고&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;직접 호출하지 않도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;cancelAllOperation 호출 시&lt;br /&gt;Operation 내부적으로 isCancelled 상태를 가지게 되고,&lt;br /&gt;시작 시 isCancelled 면 동작을 하지 않도록 예외 처리한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-14:64&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS 개발/iOS</category>
      <category>AsyncOperation</category>
      <category>crash</category>
      <category>OperationQueue</category>
      <category>Suspend</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/264</guid>
      <comments>https://beankhan.tistory.com/264#entry264comment</comments>
      <pubDate>Wed, 29 Jun 2022 15:51:03 +0900</pubDate>
    </item>
    <item>
      <title>Optimization Level + Assertion</title>
      <link>https://beankhan.tistory.com/242</link>
      <description>&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;컴파일러에게 빌드를 특정 수준으로 최적화 레벨을 설정할 수 있는 옵션&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빌드속도 증가를 위해서 Fastest 설정&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Apple Clang - Code Generation (ObjectiveC)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2021-03-12 오전 10.08.24.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxttWs/btqZWM8VtVa/kqyFiVUw6P02GfwlqZmuBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxttWs/btqZWM8VtVa/kqyFiVUw6P02GfwlqZmuBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxttWs/btqZWM8VtVa/kqyFiVUw6P02GfwlqZmuBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxttWs%2FbtqZWM8VtVa%2FkqyFiVUw6P02GfwlqZmuBK%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-03-12 오전 10.08.24.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;294&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Swift Compiler - Code Generation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;스크린샷 2021-03-12 오전 10.16.23.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;164&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvVuJ2/btqZTUfLYu3/MAvbjYKmEPDL1K0SIGjGmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvVuJ2/btqZTUfLYu3/MAvbjYKmEPDL1K0SIGjGmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvVuJ2/btqZTUfLYu3/MAvbjYKmEPDL1K0SIGjGmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvVuJ2%2FbtqZTUfLYu3%2FMAvbjYKmEPDL1K0SIGjGmk%2Fimg.png&quot; data-filename=&quot;스크린샷 2021-03-12 오전 10.16.23.png&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;164&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-Onone&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%;&quot;&gt;일반적인 개발 모드&lt;br /&gt;최소한의 최적화 수행 및 디버그 정보 보존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-O&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%;&quot;&gt;상용 모드&lt;br /&gt;생성되는 코드의 유형과 양을 크게 변경할 수 있는 적극적인 최적화 수행&lt;br /&gt;디버그 정보는 손실&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-Osize&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%;&quot;&gt;성능보다 코드 크기를 우선시 하는 특수 최적화 모드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18.1395%;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;-Ounchecked&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 81.8605%;&quot;&gt;성능을 위해 안전성을 교환하는 특수 최적화 모드&lt;br /&gt;오버플로/유형 검사 제거&amp;nbsp;&lt;br /&gt;일반적으로 사용하기 위한 모드는 아님.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;앱 내 Assertion 사용 시 설정 주의 필요&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Swift 의 경우&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;-Onone 의 경우 assertion 이 동작,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-O, 0Ounchecked 의 경우 assertion 이 동작하지 않음&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1615512245516&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;func assert(_ condition: @autoclosure () -&amp;gt; Bool, _ message: @autoclosure () -&amp;gt; String = String(), file: StaticString = #file, line: UInt = #line)&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In playgrounds and&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Onone&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;builds (the default for Xcode&amp;rsquo;s Debug configuration): If&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;condition &lt;/span&gt;evaluates to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;, stop program execution in a debuggable state after printing&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-O&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;builds (the default for Xcode&amp;rsquo;s Release configuration),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;condition&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not evaluated, and there are no effects.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;-Ounchecked&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;builds,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;condition&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;is not evaluated, but the optimizer may assume that it&lt;span&gt;&amp;nbsp;&lt;/span&gt;always evaluates to&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;. Failure to satisfy that assumption is a serious programming error.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Objective C 의 경우&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;최적화 Level 과 assertion 은 관련이 없음&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://gwangyonglee.tistory.com/50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gwangyonglee.tistory.com/50&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dmtopolog.com/code-optimization-for-swift-and-objective-c/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dmtopolog.com/code-optimization-for-swift-and-objective-c/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/57156601/optimization-levels-in-xcode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stackoverflow.com/questions/57156601/optimization-levels-in-xcode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS 개발/iOS</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/242</guid>
      <comments>https://beankhan.tistory.com/242#entry242comment</comments>
      <pubDate>Fri, 12 Mar 2021 10:31:29 +0900</pubDate>
    </item>
    <item>
      <title>PHImageManager requestImage 의 TargetSize 별 속도차이</title>
      <link>https://beankhan.tistory.com/241</link>
      <description>&lt;p&gt;오랜만에 iOS 를 다시하려니..&amp;nbsp;&lt;/p&gt;
&lt;p&gt;쉽지는 않다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간단한 3개의 column 을 가진 갤러리인데 왜 이것저것 문제가 생기는지 원&lt;/p&gt;
&lt;p&gt;무튼..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TargetSize 가 클 때 버벅이는 문제점&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PHImageManager 를 이용해 requestImage 후&lt;/p&gt;
&lt;p&gt;UICollectionViewCell 에 image 를 채워주는 코드다.&lt;/p&gt;
&lt;pre id=&quot;code_1611293913661&quot; class=&quot;swift&quot; style=&quot;margin: 20px auto 0px; display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; cursor: default; z-index: 1;&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let asset = self.fetchResult[indexPath.item]
cell.requestIdentifier = asset.localIdentifier
self.imageManager.requestImage(for: asset,
                               targetSize: targetSize,
                               contentMode: .aspectFill,
                               options: nil) { (image, info) in
      if let image = image,
          cell.requestIdentifier == asset.localIdentifier {
          cell.refreshImage(image)
      }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기서 targetSize 가 360을 초과할 때 문제가 생긴다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;target size 를 cell size * UIScreen.main.scale 로 표시할 때&lt;/p&gt;
&lt;p&gt;375 이상 단말에서 발생한다.&lt;/p&gt;
&lt;p&gt;(iPhone Xs, iPhone 12 Pro Max 모두 동일)&lt;/p&gt;
&lt;pre id=&quot;code_1611294090459&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let targetSize = CGSize(width: cell.bounds.size.width * UIScreen.main.scale,
                        height: cell.bounds.size.height * UIScreen.main.scale)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;requestImage Loading 시간 Test&lt;/h3&gt;
&lt;p&gt;환경은 iPhone Xs, iOS 14.3 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;targetSize = CGSize(width: 360, height: 360)&lt;/h4&gt;
&lt;pre id=&quot;code_1611295765739&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;loadImage 133.6190700531006ms
loadImage 86.13002300262451ms
loadImage 81.03799819946289ms
loadImage 76.26807689666748ms
loadImage 72.24202156066895ms
loadImage 68.07899475097656ms
loadImage 59.33105945587158ms
loadImage 54.16405200958252ms
loadImage 49.3619441986084ms
loadImage 44.40498352050781ms
loadImage 39.225101470947266ms
loadImage 35.03704071044922ms
loadImage 30.121922492980957ms
loadImage 25.251030921936035ms
loadImage 7.327914237976074ms
loadImage 16.730070114135742ms
loadImage 10.842084884643555ms
loadImage 11.767029762268066ms
loadImage 7.25400447845459ms
loadImage 6.973981857299805ms
loadImage 7.227897644042969ms
loadImage 6.693005561828613ms
loadImage 7.0389509201049805ms&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;최초 로드 시 조금 overload 가 있을 뿐, 이후에는 cache 도 되는 것으로 보인다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;targetSize = CGSize(width: 361, height: 361)&lt;/h4&gt;
&lt;pre id=&quot;code_1611295914006&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;loadImage 580.5469751358032ms
loadImage 622.2449541091919ms
loadImage 673.117995262146ms
loadImage 610.7490062713623ms
loadImage 574.8450756072998ms
loadImage 599.7929573059082ms
loadImage 411.51106357574463ms
loadImage 426.4489412307739ms
loadImage 409.8759889602661ms
loadImage 472.31197357177734ms
loadImage 468.2660102844238ms
loadImage 527.7990102767944ms
loadImage 534.7820520401001ms
loadImage 591.8979644775391ms
loadImage 598.7859964370728ms
loadImage 104.32195663452148ms
loadImage 98.97208213806152ms
loadImage 172.6769208908081ms
loadImage 182.95001983642578ms
loadImage 255.5069923400879ms
loadImage 247.4379539489746ms
loadImage 309.08799171447754ms
loadImage 305.5839538574219ms
loadImage 357.0899963378906ms
loadImage 337.4519348144531ms
loadImage 392.5809860229492ms
loadImage 388.3800506591797ms
loadImage 437.3970031738281ms
loadImage 429.92091178894043ms
loadImage 490.8970594406128ms
loadImage 464.81597423553467ms
loadImage 521.8160152435303ms
loadImage 507.76004791259766ms
loadImage 567.1910047531128ms
loadImage 552.5209903717041ms
loadImage 578.2270431518555ms
loadImage 611.9949817657471ms
loadImage 646.6279029846191ms
loadImage 631.3750743865967ms
loadImage 608.3649396896362ms&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;한 장 로드하는데 0.6초씩 걸릴 때도 있다.&lt;/p&gt;
&lt;p&gt;스크롤 해도 cache 되지 않아 이미지를 로드하는데 오랜 시간이 걸린다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;360.1 로 해도 마찬가지로 느리다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p&gt;PHImageManager 의 requestImage 시 targetSize 가 360 을 초과한 것이라면 성능상 사용할 수 없을 정도의 속도가 나온다.&lt;/p&gt;
&lt;p&gt;iPhone Xs, iPhone Xs Max, iPhone 12 Pro Max 모두 마찬가지이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PHCachingImageManager 는 scroll 시 다음 Cell 에 그려질 asset 에 대해 cache 하는 것이므로&lt;/p&gt;
&lt;p&gt;최초 화면을 보여줄 때는 똑같이 Load 가 걸려 사용에 큰 의미는 없다...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선은 size 를 제한해보려하는데.. 이것만이 답일지 잘 모르겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>iOS 개발/iOS</category>
      <category>PHImageManager</category>
      <category>requestImage</category>
      <category>Swift</category>
      <category>targetSize</category>
      <category>Trouble</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/241</guid>
      <comments>https://beankhan.tistory.com/241#entry241comment</comments>
      <pubDate>Fri, 22 Jan 2021 14:48:17 +0900</pubDate>
    </item>
    <item>
      <title>H.264 와 MPEG, FFmpeg</title>
      <link>https://beankhan.tistory.com/212</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;H.26X&lt;/h3&gt;&lt;div&gt;표준 동영상 압축 규격으로, ITU 의 한 부서 (VCEG) 에서 정한다.&lt;/div&gt;&lt;div&gt;ISO 에서 정하는 규격은 MPEG 으로 영상과 음성 시스템을 포함한 폭넓은 규격을 말한다.&lt;/div&gt;&lt;div&gt;ITU, ISO 에서 표준화를 함께 진행하는 경우가 많다.&lt;/div&gt;&lt;div&gt;(H.264 = MPEG-4 Part 10 (AVC) )&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;대부분의 표준은 특허권이 걸려있어 무료가 아니다.&lt;/div&gt;&lt;div&gt;H.264 코덱을 이용하는 한국 DMB 도 MPEG-LA 에 로열티를 지불하고 있다.&lt;/div&gt;&lt;div&gt;MPEG-LA 는 수익을 얻지 않거나&amp;nbsp;&lt;/div&gt;&lt;div&gt;일정 규모 이하의 경우에는 사용료를 면제해준다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Xvid 나 x264 와 같이 오픈소스 그룹에서 만드는 호환 규약을 써도 로열티 문제는 해결되지 않는다.&lt;/div&gt;&lt;div&gt;위 2가지를 사용하면 GPL 이나 LGPL 규약을 따라야 해서 프로그램 소스 공개의무가 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;H.264&lt;/h3&gt;&lt;div&gt;2003 년에 발표된 동영상 표준 규격으로 AVC(Advanced Video Coding) 이라는 것으로도 쓰인다.&lt;/div&gt;&lt;div&gt;압축률도 좋고 낮은 비트레이트에서도 좋은 화질을 가진다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자세히)&amp;nbsp;https://namu.wiki/w/H.26x?from=H.264#s-6&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Profile, Level&lt;/h4&gt;&lt;div&gt;사용하는 Device 에 따라 다양한 용도에 맞는 가이드라인을 제시하기 위해&lt;/div&gt;&lt;div&gt;Profile, Level 이라는 개념이 생겼다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Profile 은 크로마 샘플링을 비롯한 잡다한 기법들이 적용된 가짓수 혹은 스펙의 정도를 구분한다.&lt;/div&gt;&lt;div&gt;이것저것 적용될수록 고화질을 제공하지만, 하드웨어 자원을 많이 요구한다.&lt;/div&gt;&lt;div&gt;Level 은 해상도, 프레임속도(fps), 비트레이트 같은 양적인 부분을 담당한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;FFmpeg&lt;/h3&gt;&lt;p&gt;모든 동영상, 음악, 사진 포맷들의 디코딩과 인코딩을 목표로 만들어지고 있는 오픈소스 프로젝트이다.&lt;/p&gt;&lt;p&gt;LGPL, GPL 이중 라이센스를 따른다.&lt;/p&gt;&lt;p&gt;(국산 플레이어의 GPL 위한 의혹 - https://namu.wiki/w/FFmpeg#s-6)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;제공하는 것들&lt;/h4&gt;&lt;div&gt;&lt;div&gt;ffmpeg - 미디어 포맷 변환 도구&lt;/div&gt;&lt;div&gt;ffserver - 라이브 방송을 하는 멀티미디어 스트리밍 서버&lt;/div&gt;&lt;div&gt;&lt;b&gt;libavcodec - 오디오/비디오 코덱 라이브러리&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;libavformat - 멀티미디어 컨테이너의 디먹서/먹서 라이브러리&lt;/b&gt;&lt;/div&gt;&lt;div&gt;libavdevice - 입출력 장치 제어 라이브러리&lt;/div&gt;&lt;div&gt;libavfilter - 미디어 필터 라이브러리&lt;/div&gt;&lt;div&gt;libswscale - 이미지 처리 라이브러리&lt;/div&gt;&lt;div&gt;libswresample - 오디오 처리 라이브러리&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Decoder&lt;/h4&gt;&lt;p&gt;동영상을 재생할 때 쓰이는 코덱으로&lt;/p&gt;&lt;p&gt;iOS, Mac, Android, Windows 등 모두 FFmpeg 의 libavcodec 을 기반으로 하고 있다고 무방하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Encoder&lt;/h4&gt;&lt;div&gt;대다수 인코더 프로그램들은 모두 FFmpeg 기반이다.&lt;/div&gt;&lt;div&gt;FFmpeg 을 기반으로 하는 인코더로는 곰인코더, 팟인코더,&lt;/div&gt;&lt;div&gt;서비스로 아프리카가 있다.&lt;/div&gt;&lt;div&gt;많은 인터넷 동영상 사이트들도 ffmpeg 을 이용하고 있다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Lavf (&lt;b&gt;libavformat&lt;/b&gt;) 을 사용하고 있으며 영상 인코딩에도 &lt;b&gt;libavcodec&lt;/b&gt; 을 사용하고 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wiki)&amp;nbsp;https://trac.ffmpeg.org/wiki&lt;/div&gt;&lt;p&gt;General option)&amp;nbsp;https://namu.wiki/w/FFmpeg#s-4.4&lt;/p&gt;&lt;p&gt;Filter Option) https://trac.ffmpeg.org/wiki/Encode/H.264&lt;/p&gt;&lt;p&gt;Compression Quality Measure / SSIM, PSNR)&amp;nbsp;http://blog.naver.com/PostView.nhn?blogId=y4769&amp;amp;logNo=220505513170&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>기타 개발/동영상</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/212</guid>
      <comments>https://beankhan.tistory.com/212#entry212comment</comments>
      <pubDate>Fri, 18 Jan 2019 11:09:21 +0900</pubDate>
    </item>
    <item>
      <title>동영상, Codec, Container</title>
      <link>https://beankhan.tistory.com/211</link>
      <description>&lt;h3&gt;동영상&lt;/h3&gt;&lt;div&gt;기술적으로 비디오는 영화필름을 빨리 돌리는 플립북과 동일하다.&lt;/div&gt;&lt;div&gt;이미지를 주사율 (FPS, 초당 프레임) 에 맞춰 넘겨주고 &lt;br /&gt;오디오를 싱크시키면 만들어진다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;하지만 위 경우 용량이 매우 커지기에&amp;nbsp;&lt;/div&gt;&lt;div&gt;압축이 필요하다.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;압축 알고리즘을 Codec 이라 부른다.&lt;/div&gt;&lt;div&gt;(동영상 기술의 발전 = 압축 알고리즘의 발전)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Codec 이란&lt;/h3&gt;&lt;div&gt;&lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Co&lt;/span&gt;&lt;/b&gt;der and &lt;b&gt;&lt;span style=&quot;font-size: 12pt;&quot;&gt;Dec&lt;/span&gt;&lt;/b&gt;oder&lt;/div&gt;&lt;div&gt;음성 또는 영상의 신호를 디지털 신호로 변환하는 Coder,&lt;/div&gt;&lt;div&gt;디지털 신호에서 음성 또는 영상으로 변환하는 Decoder 를 통틀어 부르는 말&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;같은 영상이라도 코덱의 차이에 따라 화질이 달라지기도 한다.&lt;/div&gt;&lt;div&gt;컴퓨터에 직접 장착하는 하드웨어 코덱이 있고, 소프트웨어 코덱도 존재한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;오디오 코덱&lt;/h4&gt;&lt;div&gt;MP3, WMA, AAC, FLAC,&amp;nbsp;ALAC 등 우리가 흔히 아는 오디오 확장자들이 코덱의 이름들이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자세히) https://namu.wiki/w/%EC%BD%94%EB%8D%B1#s-2&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;비디오 코덱&lt;/h4&gt;&lt;div&gt;H.26x, WMV, VP9, AV1, ProRes 등이 있다.&lt;/div&gt;&lt;div&gt;H.264 는 블루레이, 아이폰 이후 스마트폰에서 활용되며 현재 가장 널리 쓰인다.&lt;/div&gt;&lt;div&gt;H.265 는 UHD 환경에서 쓰일 예정이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;비디오는 영상과 음성이 (때로는 자막도) 함께 들어있어 컨테이너라는 개념이 필요&lt;/b&gt;하다.&lt;/div&gt;&lt;div&gt;이에, 파일의 확장자명과 코덱명이 따로 놀 수 있다.&lt;/div&gt;&lt;div&gt;&lt;b&gt;오디오 확장자가 코덱명을 따르는 반면, 영상의 확장자는 코덱명으로 되어있는 것이 거의 없다.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자세히) https://namu.wiki/w/%EC%BD%94%EB%8D%B1#s-3&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Container 란&lt;/h3&gt;&lt;div&gt;비디오 파일 확장자를 의미한다.&lt;/div&gt;&lt;div&gt;어느 회사/단체에서 만들어졌는지,&lt;/div&gt;&lt;div&gt;랜덤 액세스가 가능한지,&lt;/div&gt;&lt;div&gt;스트리밍에 강한지,&lt;/div&gt;&lt;div&gt;고화질을 추구하는지,&lt;/div&gt;&lt;div&gt;비디오인지 오디오인지에 따라 다양한 컨테이너가 존재한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;AVI, MKV, MPEG (MP4), WMV 등이 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;자세히)&amp;nbsp;https://namu.wiki/w/%EB%B9%84%EB%94%94%EC%98%A4?from=%EB%8F%99%EC%98%81%EC%83%81#s-1.2.3.2&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>기타 개발/동영상</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/211</guid>
      <comments>https://beankhan.tistory.com/211#entry211comment</comments>
      <pubDate>Fri, 18 Jan 2019 10:58:20 +0900</pubDate>
    </item>
    <item>
      <title>[꺼내먹어요 1.2 Update] 카테고리 기능을 추가했습니다!</title>
      <link>https://beankhan.tistory.com/203</link>
      <description>&lt;h2&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;[1.2 Update]&lt;/h2&gt;&lt;h3&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;1. Category 기능을 추가했습니다.&lt;/h3&gt;&lt;div&gt;카테고리를 아래와 같이 추가할 수 있습니다.&lt;/div&gt;&lt;div&gt;추가되면 리스트에서 빠르게 검색 후 꺼내먹을 수 있어요!&lt;/div&gt;&lt;div&gt;(안타깝게도 카테고리가 자동으로 설정되지는 않아요..)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;clear: none; float: none; text-align: left;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 250px; width: 250px; height: 444px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999FF33359D73FB620&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999FF33359D73FB620&quot; width=&quot;250&quot; height=&quot;444&quot; filename=&quot;Screen Shot 2017-10-06 at 오후 4.43.11.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 250px; height: 444px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 250px; text-align: center; width: 250px; height: 444px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BA2E3359D7400820&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BA2E3359D7400820&quot; width=&quot;250&quot; height=&quot;444&quot; filename=&quot;Screen Shot 2017-10-06 at 오후 5.33.50.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;text-align: center; width: 250px; height: 444px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;clear: none; float: none; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3&gt;2. Swipe 시 Category, Map 정보를 추가할 수 있어요.&lt;/h3&gt;&lt;div&gt;지도 설정이 어렵다는 의견이 있어서 Map 버튼을 밖으로 꺼내봤어요.&lt;/div&gt;&lt;div&gt;사용 중 불편한 점이 있으시다면 언제든 리뷰에 달아주세요~&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>iOS 개발/꺼내먹어요</category>
      <category>eating out</category>
      <category>Eatingout</category>
      <category>꺼내먹어요</category>
      <category>꺼내먹어요 앱</category>
      <category>꺼내먹어요 업데이트</category>
      <category>맛집관리</category>
      <category>앱 꺼내먹어요</category>
      <category>앱 업데이트</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/203</guid>
      <comments>https://beankhan.tistory.com/203#entry203comment</comments>
      <pubDate>Fri, 6 Oct 2017 17:30:25 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] KeyChain 에 저장된 값은 앱 삭제 전까지 정말 사라지지 않는가</title>
      <link>https://beankhan.tistory.com/202</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Keychain 은 앱 삭제 전까지 정말 사라지지 않는가?&lt;/h2&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;사라질 수 있다. ㅠㅠ&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;조건&lt;/h3&gt;&lt;div&gt;iOS 10.3.3 이상 단말,&lt;/div&gt;&lt;div&gt;Key 생성 시 kSecAttrAccessible 설정을 하지 않았다 (default 값으로 두었다)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;u&gt;&lt;b&gt;kSecAttrAccessible 설정값 참고 :&amp;nbsp;http://beankhan.tistory.com/109&lt;/b&gt;&lt;/u&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;언제 발생하는가?&lt;/h3&gt;&lt;div&gt;1. iTunes 를 이용한 백업 / 복원 시&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. iCloud 를 이용한 백업 / 복원 시&lt;/div&gt;&lt;div&gt;설정 &amp;gt; iCloud &amp;gt; Keychain 옵션이 꺼져있는경우&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;사라지지 않게 할 수 있는가?&lt;/h3&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;없다.&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;iTunes 를 이용한 백업 / 복원 시 남겨두고 싶다면&lt;/div&gt;&lt;div&gt;kSecAttrAccessible 설정을 (ThisDevice) 가 없는 단어로 설정하면 된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;iCloud 를 이용한 백업 / 복원 시에는&lt;/div&gt;&lt;div&gt;ThisDevice 속성을 가진 Keychain 값이라도 남아있다. (사라지지 않는다.)&lt;/div&gt;&lt;div&gt;하지만,&amp;nbsp;사용자가&amp;nbsp;iCloud 설정에서&amp;nbsp;Keychain 백업&amp;nbsp;옵션을 꺼놓았다면&lt;/div&gt;&lt;div&gt;사라질 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;결론&lt;/h2&gt;&lt;div&gt;KeyChain 을 앱 삭제전까지 유효한 저장공간이라고 보기는 어렵다.&lt;/div&gt;&lt;div&gt;영구히 저장해야할 데이터가 있다면 다른 공간을 알아보는 것이 좋다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;참고&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;http://beankhan.tistory.com/109&lt;/div&gt;&lt;div&gt;http://beankhan.tistory.com/194&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>iOS 개발/iOS</category>
      <category>ios</category>
      <category>ios keychain</category>
      <category>keychain</category>
      <category>kSecAttrAccessible</category>
      <category>Objective C</category>
      <category>Swift</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/202</guid>
      <comments>https://beankhan.tistory.com/202#entry202comment</comments>
      <pubDate>Thu, 28 Sep 2017 16:15:24 +0900</pubDate>
    </item>
    <item>
      <title>[Swift 4] Swift 3 -&amp;gt; Swift 4 Migration (Limiting @objc inference)</title>
      <link>https://beankhan.tistory.com/201</link>
      <description>&lt;h3&gt;출처&lt;/h3&gt;&lt;div&gt;https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;소개&lt;/h2&gt;&lt;div&gt;Swift 3 에서 사용되었던 @objc 추론에 제한을 둡니다.&lt;/div&gt;&lt;div&gt;편의상, Swift 는 @objc 를 여러 곳에서 유추해왔었습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;변경 이유&lt;/h2&gt;&lt;p&gt;1) Swift 의 @objc 에 대한 추론 규칙은 단순하며,&amp;nbsp;&lt;/p&gt;&lt;p&gt;@objc 가 유추되는 이유가&amp;nbsp;사용자에게 불명확할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2) 클래스가 많아질경우 실수로 Objective-C 충돌을 발생시키는&amp;nbsp;&lt;/p&gt;&lt;p&gt;Swift 클래스를 작성하기 쉽습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3) Swift 코드 디자인 지침을 따랐지만&amp;nbsp;&lt;/p&gt;&lt;p&gt;Objective-C 코드 작성 규칙을&amp;nbsp;위반하는 경우가 있습니다.&lt;/p&gt;&lt;p&gt;아래와 같은 경우 명시적인 @objc 주석이 필요합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;MyNumber :&amp;nbsp;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(231, 232, 235);&quot;&gt;NSObject&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;(&lt;span class=&quot;s1&quot;&gt;_&lt;/span&gt;&amp;nbsp;int:&amp;nbsp;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(231, 232, 235);&quot;&gt;Int&lt;/span&gt;) { }&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(225, 45, 160);&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(24, 181, 177);&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(24, 181, 177);&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(24, 181, 177);&quot;&gt;&amp;nbsp;double:&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(231, 232, 235);&quot;&gt;Double&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(24, 181, 177);&quot;&gt;) { }&amp;nbsp;&lt;/span&gt;// error: initializer 'init' with Objective-C selector 'init:'&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(225, 45, 160);&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(24, 181, 177);&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;// conflicts with previous declaration with the same Objective-C selector&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0px; margin-bottom: 0px; color: rgb(0, 0, 0); font-family: &amp;quot;맑은 고딕&amp;quot;, sans-serif; font-size: 13px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; MyNumber : &lt;span class=&quot;s2&quot;&gt;NSObject&lt;/span&gt; {&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@objc&lt;/span&gt;(initWithInteger:) &lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;(&lt;span class=&quot;s1&quot;&gt;_&lt;/span&gt; int: &lt;span class=&quot;s2&quot;&gt;Int&lt;/span&gt;) { }&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@objc&lt;/span&gt;(initWithDouble:) &lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;(&lt;span class=&quot;s1&quot;&gt;_&lt;/span&gt; double: &lt;span class=&quot;s2&quot;&gt;Double&lt;/span&gt;) { }&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
&lt;/style&gt;







&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4) 각각의 Objective-C entry point 에 cost 가 있다는 점입니다.&lt;/p&gt;&lt;p&gt;Swift 컴파일러는 Objective-C 호출 규칙에서 Swift 호출 규칙으로 변경하기 위한&amp;nbsp;&lt;/p&gt;&lt;p&gt;map 의 &quot;thunk&quot; method 를 만들어야합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이런 &quot;thunk&quot; method 는 는 Objective-C metadata 에 기록되기 때문에&amp;nbsp;&lt;/p&gt;&lt;p&gt;binary 크기가 증가됩니다.&lt;/p&gt;&lt;p&gt;또한 dynamic linker 는 이런 thunk method 를 위해&amp;nbsp;&lt;/p&gt;&lt;p&gt;Objective-C metadata 를 정렬해야하기 때문에&amp;nbsp;&lt;/p&gt;&lt;p&gt;로드 시간에 약간의 영향을 줄 수 있습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;해결 방안&lt;/h2&gt;&lt;div&gt;1) @objc 추론을 프로그래밍 모델의 의미론적 일관성에 필요한 곳으로 제한합니다.&lt;/div&gt;&lt;div&gt;2) class, extension 에서의 새로운 annotation 을&amp;nbsp;추가하여&amp;nbsp;&lt;/div&gt;&lt;div&gt;@objc 추론을 보다 광범위하게 활성화 / 비활성화하려는 경우에 사용합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;dynamic, NSObject -derived classes&amp;nbsp;no longer infers @objc&lt;/h3&gt;&lt;div&gt;dynamic 으로 선언된 함수 or 변수나 NSObject 를 상속받은 Class 는&lt;/div&gt;&lt;div&gt;@objc 를 붙이지 않는이상 추론되지 않습니다.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;MyClass :&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;NSObject&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;foo() { }&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;bar() { }&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;UnrelatedClass :&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;NSObject&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@objc&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;bar() { }&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;test(object:&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;AnyObject&lt;/span&gt;) {&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;o&lt;/span&gt;bject.foo?()&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// Swift 3: can call method MyClass.foo()&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// Swift 4: compiler error, no @objc method &quot;foo()&quot;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;object.bar?()&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// Swift 3: can call MyClass.bar() or UnrelatedClass.bar()&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// Swift 4: can only call UnrelatedClass.bar()&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;MySuperclass :&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;NSObject&lt;/span&gt;&amp;nbsp;{ }&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s1&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;&lt;/span&gt;MySuperclass&lt;span class=&quot;s3&quot;&gt;&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;extMethod() { }&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;// implicitly @objc in Swift 3, not in Swift 4&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;MySubclass :&amp;nbsp;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;MySuperclass&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;override&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s5&quot;&gt;e&lt;/span&gt;xtMethod() { }&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;// Swift 3: okay&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;// Swift 4: error &quot;declarations in extensions cannot override yet&quot;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Re-enabling @objc inference within a class hierarchy&lt;/h3&gt;&lt;div&gt;일부 라이브러리 및 시스템 (ex. XCTest ) 은 여전히 Objective-C 런타임의 내부 기능에 크게 의존합니다.&lt;/div&gt;&lt;div&gt;이러한 시스템을 지원하려면 @objcMembers 라는 annotation 을 사용하여&lt;/div&gt;&lt;div&gt;클래스, 확장자, 하위클래스 및 모든 확장자에 대한 @objc 유추를 다시 활성화합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e12da0; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36; min-height: 14.0px}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #51c34f}
span.s4 {color: #e7e8eb}
span.s5 {color: #18b5b1}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;@objcMembers&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; MyClass : &lt;span class=&quot;s2&quot;&gt;NSObject&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; foo() { } &lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;// implicitly @objc&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p5&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; bar() -&amp;gt; (&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(225, 45, 160);&quot;&gt;{ &amp;nbsp;}&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;// not @objc, because tuple returns&lt;/p&gt;
&lt;p class=&quot;p5&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// aren't representable in Objective-C&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;extension&lt;span class=&quot;s4&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;MyClass&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p5&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; baz() { } &lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;// implicitly @objc&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; MySubClass : &lt;span class=&quot;s5&quot;&gt;MyClass&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; wibble() { } &lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;// implicitly @objc&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p6&quot;&gt;&lt;span class=&quot;s1&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; &lt;/span&gt;MySubClass&lt;span class=&quot;s4&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; wobble() { } &lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;// implicitly @objc&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Enabling/Disabling @objc inference within an extension&lt;/h3&gt;&lt;div&gt;Objective C 에 원하는 method 만 노출시키고 싶을 때가 있습니다.&lt;/div&gt;&lt;div&gt;이를 위해 @objc, @nonobjc 를 지정할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; SwiftClass: NSObject&amp;nbsp;{ }&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;@objc&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;extension&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;SwiftClass&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; foo() { }&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;// implicitly @objc&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@nonobjc&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; bar() -&amp;gt; (&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;Int&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;) { &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;) }&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;// error: tuple type (Int, Int) not&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;// expressible in @objc. add @nonobjc or move this method to fix the issue&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;@objcMembers&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; MyClass : &lt;span class=&quot;s5&quot;&gt;NSObject&lt;/span&gt; {&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; wibble() { }&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;// implicitly @objc&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;@nonobjc&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;extension&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;MyClass&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; wobble() { }&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;// not @objc, despite @objcMembers&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e12da0; background-color: #292b36}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #e7e8eb}
span.s3 {color: #18b5b1}
span.s4 {color: #51c34f}
span.s5 {color: #29a09f}
span.s6 {color: #00aaa3}
&lt;/style&gt;



















&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;Constructs that (still) infer @objc&lt;/h3&gt;&lt;div&gt;기존에 유추되던 부분이 그대로 사용되는 곳도 있습니다.&lt;/div&gt;&lt;div&gt;@objc 가 선언된 method, protocol 을 상속, 구현하는 경우&lt;/div&gt;&lt;div&gt;@IBAction, @IBOutlet, @NSManaged, @GKInspectable, @IBInspectable 의 경우&lt;/div&gt;&lt;div&gt;@objc 로 유추됩니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;Super {&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;@objc&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;foo() { }&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;Sub :&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;Super&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;/* inferred @objc */&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;override&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;foo() { }&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;@objc&lt;/span&gt;&amp;nbsp;&lt;span class=&quot;s1&quot;&gt;protocol&lt;/span&gt;&amp;nbsp;MyDelegate {&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;bar()&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt;&amp;nbsp;MyClass :&amp;nbsp;&lt;span class=&quot;s2&quot;&gt;MyDelegate&lt;/span&gt;&amp;nbsp;{&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(81, 195, 79);&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;/* inferred @objc */&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&amp;nbsp;bar() { }&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Side benefit: more reasonable expectations&lt;/h2&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e12da0; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #29a09f; background-color: #292b36}
span.s1 {color: #e7e8eb}
span.s2 {color: #18b5b1}
span.s3 {color: #e12da0}
span.s4 {color: #29a09f}
span.s5 {text-decoration: underline ; color: #de3a3c}
span.s6 {color: #de3a3c}
span.s7 {color: #51c34f}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;@objc&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;protocol&lt;span class=&quot;s1&quot;&gt; P { }&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;extension&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;P&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;func&lt;/span&gt; bar() { }&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s3&quot;&gt;class&lt;/span&gt; C : &lt;span class=&quot;s4&quot;&gt;NSObject&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;P&lt;/span&gt; { }&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s3&quot;&gt;let&lt;/span&gt; c = &lt;span class=&quot;s2&quot;&gt;C&lt;/span&gt;()&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;print&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;responds&lt;span class=&quot;s1&quot;&gt;(to: &lt;/span&gt;Selector&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;bar&quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;))) &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;// prints &quot;false&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Limitation Activate Setting&lt;/h2&gt;&lt;div&gt;Project -&amp;gt; Target -&amp;gt; Build Settings -&amp;gt; inference 검색 후&lt;/div&gt;&lt;div&gt;Swift 3 @objc Inference 를 On -&amp;gt; Default 로 변경&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 620px; width: 620px; height: 159px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A1113359C2095D14&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A1113359C2095D14&quot; width=&quot;620&quot; height=&quot;159&quot; filename=&quot;스크린샷 2017-09-20 오후 3.09.17.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 620px; height: 159px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #e7e8eb}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #e7e8eb}
&lt;/style&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #e7e8eb}
&lt;/style&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36; min-height: 14.0px}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {text-decoration: underline}
span.s4 {color: #e7e8eb}
&lt;/style&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #e7e8eb}
span.s4 {color: #18b5b1}
span.s5 {text-decoration: underline}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>iOS 개발/Swift</category>
      <category>@nonobjc</category>
      <category>@objc</category>
      <category>@objcMembers</category>
      <category>inference</category>
      <category>migration</category>
      <category>Objective C</category>
      <category>Swift</category>
      <category>Swift 4</category>
      <category>Swift 4.0</category>
      <category>swift4</category>
      <category>Upgrade</category>
      <category>Xcode 9</category>
      <category>추론</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/201</guid>
      <comments>https://beankhan.tistory.com/201#entry201comment</comments>
      <pubDate>Thu, 21 Sep 2017 09:00:00 +0900</pubDate>
    </item>
    <item>
      <title>[Swift4] Swift 4 에서 변경된점</title>
      <link>https://beankhan.tistory.com/200</link>
      <description>&lt;h3&gt;출처&lt;/h3&gt;&lt;div&gt;https://www.raywenderlich.com/163857/whats-new-swift-4&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Api Changes&lt;/h2&gt;&lt;h3&gt;String&lt;/h3&gt;&lt;div&gt;더 이상 characters array 를 사용할 필요는 없습니다.&lt;/div&gt;&lt;div&gt;direct 로 iterate 를 돌 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #e7e8eb}
span.s3 {color: #18b5b1}
span.s4 {color: #29a09f}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; str = &lt;/span&gt;&quot;Hello &quot;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;for&lt;/span&gt; char &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;str&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;print&lt;/span&gt;(char)&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;direct 로 돌 수 있듯이,&amp;nbsp;&lt;/p&gt;&lt;p&gt;Sequence, Collection 의 기능들을 모두 사용할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; count = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;count&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; isEmpty = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;isEmpty&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; elloString = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;dropFirst&lt;/span&gt;()&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; lloString = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;dropFirst&lt;/span&gt;(&lt;span class=&quot;s4&quot;&gt;2&lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; reverseString = &lt;span class=&quot;s3&quot;&gt;String&lt;/span&gt;(&lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;reversed&lt;/span&gt;())&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; filterString = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;filter&lt;/span&gt; { (char) -&amp;gt; &lt;span class=&quot;s3&quot;&gt;Bool&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; isAscii = char.&lt;span class=&quot;s3&quot;&gt;unicodeScalars&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;reduce&lt;/span&gt;(&lt;span class=&quot;s1&quot;&gt;true&lt;/span&gt;, { (result, scalar) -&amp;gt; &lt;span class=&quot;s3&quot;&gt;Bool&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt; result &amp;amp;&amp;amp; scalar.&lt;span class=&quot;s3&quot;&gt;isASCII&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;})&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt; isAscii&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #00aaa3}
&lt;/style&gt;













&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Swift 4 에서는 String 의 subsequence 로 Substring type 이 제공됩니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;StringProtocol 이 추가되습니다.&lt;/p&gt;&lt;p&gt;String, SubString 은 String Protocol 을 따르고 다양한 기능을 제공합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; endIndex = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;index&lt;/span&gt;(&lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;startIndex&lt;/span&gt;, offsetBy: &lt;span class=&quot;s4&quot;&gt;4&lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; helloSubString = &lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;[&lt;span class=&quot;s2&quot;&gt;str&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;startIndex&lt;/span&gt;...&lt;span class=&quot;s2&quot;&gt;endIndex&lt;/span&gt;]&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;helloSubString&lt;span class=&quot;s5&quot;&gt; += &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; helloWithEmoji = &lt;span class=&quot;s3&quot;&gt;String&lt;/span&gt;(&lt;span class=&quot;s2&quot;&gt;helloSubString&lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; hasPrefix = &lt;span class=&quot;s2&quot;&gt;helloWithEmoji&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;hasPrefix&lt;/span&gt;(&lt;span class=&quot;s6&quot;&gt;&quot;He&quot;&lt;/span&gt;)&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #00aaa3}
span.s5 {color: #e7e8eb}
span.s6 {color: #de3a3c}
&lt;/style&gt;







&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; hasSuffix = &lt;span class=&quot;s2&quot;&gt;helloWithEmoji&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;hasSuffix&lt;/span&gt;(&lt;span class=&quot;s6&quot;&gt;&quot; &quot;&lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;String 이 이모티콘을 해석하는 방식이 변경되었습니다.&lt;/p&gt;&lt;p&gt;유니코드 때문에 다양한 code 들이 생성되었었는데요,&lt;/p&gt;&lt;p&gt;skin-tone 이 들어간 경우 4글자, 아니면 2글자의 unicode 로 해석되던 것이&lt;/p&gt;&lt;p&gt;모두 1글자로 해석되도록 변경되었습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&quot; ‍ &quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;// Now: 1, Before: 2&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;// Now: 1, Before: 2&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #de3a3c}
span.s2 {color: #e7e8eb}
span.s3 {color: #29a09f}
&lt;/style&gt;




&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&quot; ‍❤️‍ ‍ &quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;// Now: 1, Before, 4&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Dictionary and Set&lt;/h3&gt;&lt;h4&gt;Sequence Based Initialization&lt;/h4&gt;&lt;p&gt;sequence key-value pair 로 Dictionary 를 만들 수 있습니다.&lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #e7e8eb}
span.s3 {color: #00aaa3}
span.s4 {color: #29a09f}
span.s5 {color: #18b5b1}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; nearestStarNames = [&lt;/span&gt;&quot;Proxima Centauri&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Alpha Centauri A&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Alpha Centauri B&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Barnard's Star&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Wolf 359&quot;&lt;span class=&quot;s2&quot;&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; nearestStarDistances = [&lt;span class=&quot;s3&quot;&gt;4.24&lt;/span&gt;, &lt;span class=&quot;s3&quot;&gt;4.37&lt;/span&gt;, &lt;span class=&quot;s3&quot;&gt;4.37&lt;/span&gt;, &lt;span class=&quot;s3&quot;&gt;5.96&lt;/span&gt;, &lt;span class=&quot;s3&quot;&gt;7.78&lt;/span&gt;]&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; starDistanceDict = &lt;span class=&quot;s4&quot;&gt;Dictionary&lt;/span&gt;(uniqueKeysWithValues: &lt;span class=&quot;s4&quot;&gt;zip&lt;/span&gt;(&lt;span class=&quot;s5&quot;&gt;nearestStarNames&lt;/span&gt;, &lt;span class=&quot;s5&quot;&gt;nearestStarDistances&lt;/span&gt;))&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;// [&quot;Wolf 359&quot;: 7.78, &quot;Alpha Centauri B&quot;: 4.37, &quot;Proxima Centauri&quot;: 4.24,&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;//&quot;Alpha Centauri A&quot;: 4.37, &quot;Barnard's Star&quot;: 5.96]&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Duplicate Key Resolution&lt;/h4&gt;&lt;p&gt;Array 에 duplicate 정보가 들어있을 때도 쉽게 key 값으로 변경하여 사용할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; intElement = &lt;span class=&quot;s2&quot;&gt;repeatElement&lt;/span&gt;(&lt;span class=&quot;s3&quot;&gt;1&lt;/span&gt;, count: &lt;span class=&quot;s4&quot;&gt;favoriteStarVotes&lt;/span&gt;.&lt;span class=&quot;s2&quot;&gt;count&lt;/span&gt;) &lt;span class=&quot;s5&quot;&gt;//1, 1, 1, 1&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt; keysAndValues = &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;(&lt;/span&gt;favoriteStarVotes&lt;span class=&quot;s6&quot;&gt;, &lt;/span&gt;intElement&lt;span class=&quot;s6&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; mergedKeysAndValues = &lt;span class=&quot;s2&quot;&gt;Dictionary&lt;/span&gt;(&lt;span class=&quot;s4&quot;&gt;keysAndValues&lt;/span&gt;, uniquingKeysWith: +)&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #00aaa3}
span.s4 {color: #18b5b1}
span.s5 {color: #51c34f}
span.s6 {color: #e7e8eb}
&lt;/style&gt;





&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;// [&quot;Barnard's Star&quot;: 1, &quot;Alpha Centauri A&quot;: 2, &quot;Wolf 359&quot;: 1]&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Dictionary Mapping&lt;/h4&gt;&lt;p&gt;Dictionary 의 mapValues 를 통해 value 들에 직접 접근에 수정할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; mappedCloseStars = &lt;span class=&quot;s2&quot;&gt;closeStars&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;mapValues&lt;/span&gt; { &lt;span class=&quot;s4&quot;&gt;&quot;&lt;/span&gt;\&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;$0&lt;span class=&quot;s4&quot;&gt;)&quot;&lt;/span&gt; }&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #de3a3c}
span.s5 {color: #e7e8eb}
&lt;/style&gt;



&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;mappedCloseStars&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt; &lt;/span&gt;// [&quot;Proxima Centauri&quot;: &quot;4.24&quot;, &quot;Alpha Centauri A&quot;: &quot;4.37&quot;, &quot;Alpha Centauri B&quot;: &quot;4.37&quot;]&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Dictionary Default Values&lt;/h4&gt;&lt;div&gt;Dictionary 에서 key 값이 없을 때 처리를 우아하게 할 수 있습니다.&lt;/div&gt;&lt;div&gt;dictionary 로부터 값을 get, set 시 defaultValue 를 지정해 줄 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #de3a3c}
span.s4 {color: #51c34f}
span.s5 {color: #29a09f}
span.s6 {color: #e7e8eb}
span.s7 {color: #00aaa3}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;//Get&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; siriusDistance = &lt;span class=&quot;s2&quot;&gt;mappedCloseStars&lt;/span&gt;[&lt;span class=&quot;s3&quot;&gt;&quot;Wolf 359&quot;&lt;/span&gt;, default: &lt;span class=&quot;s3&quot;&gt;&quot;unknown&quot;&lt;/span&gt;] &lt;span class=&quot;s4&quot;&gt;// &quot;unknown&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;//Set&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; starWordsCount: [&lt;span class=&quot;s5&quot;&gt;String&lt;/span&gt;: &lt;span class=&quot;s5&quot;&gt;Int&lt;/span&gt;] = [:]&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s1&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt; starName &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt; &lt;/span&gt;nearestStarNames&lt;span class=&quot;s6&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; numWords = starName.&lt;span class=&quot;s5&quot;&gt;split&lt;/span&gt;(separator: &lt;span class=&quot;s3&quot;&gt;&quot; &quot;&lt;/span&gt;).&lt;span class=&quot;s5&quot;&gt;count&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;starWordsCount&lt;/span&gt;[starName, default: &lt;span class=&quot;s7&quot;&gt;0&lt;/span&gt;] += numWords&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s6&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// [&quot;Wolf 359&quot;: 2, &quot;Alpha Centauri B&quot;: 3, &quot;Proxima Centauri&quot;: 2,&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s6&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//&quot;Alpha Centauri A&quot;: 3, &quot;Barnard's Star&quot;: 2]&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Dictionary Grouping&lt;/h4&gt;&lt;div&gt;특정 조건에 맞는 Dictionary 로 변경할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #18b5b1}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; starsByFirstLetter = &lt;span class=&quot;s2&quot;&gt;Dictionary&lt;/span&gt;(grouping: &lt;span class=&quot;s3&quot;&gt;nearestStarNames&lt;/span&gt;) { $0.&lt;span class=&quot;s2&quot;&gt;first&lt;/span&gt;! }&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;// [&quot;B&quot;: [&quot;Barnard's Star&quot;], &quot;A&quot;: [&quot;Alpha Centauri A&quot;, &quot;Alpha Centauri B&quot;],&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;//&quot;W&quot;: [&quot;Wolf 359&quot;], &quot;P&quot;: [&quot;Proxima Centauri&quot;]]&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Reserving Capacity&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/h4&gt;&lt;p&gt;Collection 에서 reallocation 은 큰 비용을 차지하는데요,&amp;nbsp;&lt;/p&gt;&lt;p&gt;reserveCapacity(_:) 로 성능향상을 도모할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e7e8eb}
span.s2 {color: #29a09f}
span.s3 {color: #51c34f}
span.s4 {color: #18b5b1}
span.s5 {color: #00aaa3}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;starWordsCount&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;// 6&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;starWordsCount&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;reserveCapacity&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;) &lt;/span&gt;// reserves at _least_ 20 elements of capacity&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;starWordsCount&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;capacity&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;// 24&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Private Access Modifier&lt;/h3&gt;&lt;div&gt;extension 을 지원하여 code 를 논리 그룹으로 묶기를 권장하는 swift 에서&lt;/div&gt;&lt;div&gt;fileprivate 만으로는 제한사항이 있었습니다.&lt;/div&gt;&lt;div&gt;이에, Swift 4 에서는 struct, class 등과 같은 타입과 해당 타입의 extension 간에&lt;/div&gt;&lt;div&gt;동일한 액세스 제어 범위를 공유합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #18b5b1}
span.s4 {color: #e7e8eb}
span.s5 {color: #de3a3c}
span.s6 {color: #51c34f}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;struct&lt;/span&gt; SpaceCraft {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; warpCode: &lt;span class=&quot;s2&quot;&gt;String&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;(warpCode: &lt;span class=&quot;s2&quot;&gt;String&lt;/span&gt;) {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;warpCode&lt;/span&gt; = warpCode&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s1&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; &lt;/span&gt;SpaceCraft&lt;span class=&quot;s4&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; goToWarpSpeed(warpCode: &lt;span class=&quot;s2&quot;&gt;String&lt;/span&gt;) {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;if&lt;/span&gt; warpCode == &lt;span class=&quot;s1&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;warpCode&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p5&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// Error in Swift 3 unless warpCode is fileprivate&lt;/p&gt;
&lt;p class=&quot;p6&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;&quot;Do it Scotty!&quot;&lt;span class=&quot;s4&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; enterprise = &lt;span class=&quot;s3&quot;&gt;SpaceCraft&lt;/span&gt;(warpCode: &lt;span class=&quot;s5&quot;&gt;&quot;KirkIsCool&quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;enterprise&lt;span class=&quot;s4&quot;&gt;.&lt;/span&gt;goToWarpSpeed&lt;span class=&quot;s4&quot;&gt;(warpCode: &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;KirkIsCool&quot;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;// &quot;Do it Scotty!&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s6&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;위 변경으로 기존의 의도된 목적으로 fileprivate 를 사용할 수 있도록 변경되었습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Api Additions&lt;/h2&gt;&lt;h3&gt;Archival and Serialization&lt;/h3&gt;&lt;div&gt;기존 Swift 에서는 class 를 직렬화하려면 NSObject 를 상속받고,&amp;nbsp;&lt;/div&gt;&lt;div&gt;NSCoding 을 준수해야했습니다.&lt;/div&gt;&lt;div&gt;struct, enum 의 경우에도 다른 여러가지 방법들이 필요했는데요,&lt;/div&gt;&lt;div&gt;Swift 4 에서는 Codable protocol 로 이 문제를 해결합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #18b5b1}
span.s4 {color: #00aaa3}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;struct&lt;/span&gt; CuriosityLog: &lt;span class=&quot;s2&quot;&gt;Codable&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;enum&lt;/span&gt; Discovery: &lt;span class=&quot;s2&quot;&gt;String&lt;/span&gt;, &lt;span class=&quot;s2&quot;&gt;Codable&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;case&lt;/span&gt; rock, water, martian&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; sol: &lt;span class=&quot;s2&quot;&gt;Int&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; discoveries: [&lt;span class=&quot;s3&quot;&gt;Discovery&lt;/span&gt;]&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;// Create a log entry for Mars sol 42&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; logSol42 = &lt;span class=&quot;s3&quot;&gt;CuriosityLog&lt;/span&gt;(sol: &lt;span class=&quot;s4&quot;&gt;42&lt;/span&gt;, discoveries: [.&lt;span class=&quot;s3&quot;&gt;rock&lt;/span&gt;, .&lt;span class=&quot;s3&quot;&gt;rock&lt;/span&gt;, .&lt;span class=&quot;s3&quot;&gt;rock&lt;/span&gt;, .&lt;span class=&quot;s3&quot;&gt;rock&lt;/span&gt;])&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;모든 속성이 Codable 하면 프로토콜 구현은 컴파일러가 알아서 해줍니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Key-Value Coding&lt;/h3&gt;&lt;div&gt;함수는 클로저이기 때문에 함수를 호출하지 않고 참조할 수 있었습니다.&lt;/div&gt;&lt;div&gt;지금까지 불가능했던 것은 객체의 프로퍼티에 실제로 액세스하지 않고 참조를 가지는 것이었는데요,&lt;/div&gt;&lt;div&gt;Swift 4 에서는 key path 를 이용하여 프로퍼티 참조를 가지고&lt;/div&gt;&lt;div&gt;인스턴스의 기본 값을 가져오거나 설정할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #de3a3c}
span.s5 {color: #51c34f}
span.s6 {color: #e7e8eb}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;struct&lt;/span&gt; Lightsaber {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;enum&lt;/span&gt; Color {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;case&lt;/span&gt; blue, green, red&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; color: &lt;span class=&quot;s2&quot;&gt;Color&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; ForceUser {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; name: &lt;span class=&quot;s3&quot;&gt;String&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; lightsaber: &lt;span class=&quot;s2&quot;&gt;Lightsaber&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; master: &lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;?&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;(name: &lt;span class=&quot;s3&quot;&gt;String&lt;/span&gt;, lightsaber: &lt;span class=&quot;s2&quot;&gt;Lightsaber&lt;/span&gt;, master: &lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;? = &lt;span class=&quot;s1&quot;&gt;nil&lt;/span&gt;) {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;s2&quot;&gt;name&lt;/span&gt; = name&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;s2&quot;&gt;lightsaber&lt;/span&gt; = lightsaber&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;s2&quot;&gt;master&lt;/span&gt; = master&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; sidious = &lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;(name: &lt;span class=&quot;s4&quot;&gt;&quot;Darth Sidious&quot;&lt;/span&gt;, lightsaber: &lt;span class=&quot;s2&quot;&gt;Lightsaber&lt;/span&gt;(color: .&lt;span class=&quot;s2&quot;&gt;red&lt;/span&gt;))&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; obiwan = &lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;(name: &lt;span class=&quot;s4&quot;&gt;&quot;Obi-Wan Kenobi&quot;&lt;/span&gt;, lightsaber: &lt;span class=&quot;s2&quot;&gt;Lightsaber&lt;/span&gt;(color: .&lt;span class=&quot;s2&quot;&gt;blue&lt;/span&gt;))&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; anakin = &lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;(name: &lt;span class=&quot;s4&quot;&gt;&quot;Anakin Skywalker&quot;&lt;/span&gt;, lightsaber: &lt;span class=&quot;s2&quot;&gt;Lightsaber&lt;/span&gt;(color: .&lt;span class=&quot;s2&quot;&gt;blue&lt;/span&gt;), master: &lt;span class=&quot;s2&quot;&gt;obiwan&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; nameKeyPath = \&lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;.name&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; obiwanName = &lt;span class=&quot;s2&quot;&gt;obiwan&lt;/span&gt;[keyPath: &lt;span class=&quot;s2&quot;&gt;nameKeyPath&lt;/span&gt;]&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;// &quot;Obi-Wan Kenobi&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; anakinSaberColor = &lt;span class=&quot;s2&quot;&gt;anakin&lt;/span&gt;[keyPath: \&lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;.lightsaber.color]&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;// blue&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; masterKeyPath = \&lt;span class=&quot;s2&quot;&gt;ForceUser&lt;/span&gt;.master&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; anakinMasterName = &lt;span class=&quot;s2&quot;&gt;anakin&lt;/span&gt;[keyPath: &lt;span class=&quot;s2&quot;&gt;masterKeyPath&lt;/span&gt;]?.&lt;span class=&quot;s2&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;// &quot;Obi-Wan Kenobi&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;anakin&lt;span class=&quot;s6&quot;&gt;[keyPath: &lt;/span&gt;masterKeyPath&lt;span class=&quot;s6&quot;&gt;] = &lt;/span&gt;sidious&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;anakin&lt;span class=&quot;s6&quot;&gt;.&lt;/span&gt;master&lt;span class=&quot;s6&quot;&gt;?.&lt;/span&gt;name&lt;span class=&quot;s6&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;// Darth Sidious&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s5&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Multi-line String Literals&lt;/h3&gt;&lt;div&gt;대부분의 언어가 지원했었던 기능인 multi-line string literal 기능을 지원합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #de3a3c}
span.s3 {color: #e7e8eb}
span.s4 {color: #18b5b1}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; star = &lt;span class=&quot;s2&quot;&gt;&quot;⭐️&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; introString = &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;A long time ago in a galaxy far,&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;far away....&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;You can even dynamically add values&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;from properties: &lt;span class=&quot;s3&quot;&gt;\&lt;/span&gt;(&lt;span class=&quot;s4&quot;&gt;star&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&quot;&quot;&quot;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;One-Sided Ranges&lt;/h3&gt;&lt;div&gt;장황함을 줄이고 가독성을 높이기 위해 one-sided range 를 지원합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #e7e8eb}
span.s3 {color: #18b5b1}
span.s4 {color: #00aaa3}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; planets = [&lt;/span&gt;&quot;Mercury&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Venus&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Earth&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Mars&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Jupiter&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Saturn&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Uranus&quot;&lt;span class=&quot;s2&quot;&gt;, &lt;/span&gt;&quot;Neptune&quot;&lt;span class=&quot;s2&quot;&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; outsideAsteroidBelt = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;planets&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;...] &lt;/span&gt;// Before: planets[4..&amp;lt;planets.endIndex]&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; firstThree = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;planets&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;[..&amp;lt;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;]&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;// Before: planets[planets.startIndex..&amp;lt;4]&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Infinite Sequence&lt;/h4&gt;&lt;div&gt;start index 가 countable type 일 때 infinite sequence 를 사용할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #00aaa3}
span.s4 {color: #18b5b1}
span.s5 {color: #e7e8eb}
span.s6 {color: #de3a3c}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; numberedPlanets = &lt;span class=&quot;s2&quot;&gt;Array&lt;/span&gt;(&lt;span class=&quot;s2&quot;&gt;zip&lt;/span&gt;(&lt;span class=&quot;s3&quot;&gt;1&lt;/span&gt;..., &lt;span class=&quot;s4&quot;&gt;planets&lt;/span&gt;))&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;numberedPlanets&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;) &lt;/span&gt;// [(1, &quot;Mercury&quot;), (2, &quot;Venus&quot;), ..., (8, &quot;Neptune&quot;)]&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;planets&lt;span class=&quot;s5&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;&quot;Pluto&quot;&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;numberedPlanets&lt;span class=&quot;s5&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;..., &lt;/span&gt;planets&lt;span class=&quot;s5&quot;&gt;))&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;numberedPlanets&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;) &lt;/span&gt;// [(1, &quot;Mercury&quot;), (2, &quot;Venus&quot;), ..., (9, &quot;Pluto&quot;)]&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Pattern matching&lt;/h4&gt;&lt;div&gt;one-sided ranges 를 잘 사용할 수 있는 방법입니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e12da0; background-color: #292b36}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #e7e8eb}
span.s4 {color: #00aaa3}
span.s5 {color: #de3a3c}
span.s6 {color: #18b5b1}
span.s7 {color: #51c34f}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; temperature(planetNumber: &lt;span class=&quot;s2&quot;&gt;Int&lt;/span&gt;) {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;switch&lt;/span&gt; planetNumber {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;case&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; ...&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;: &lt;/span&gt;// anything less than or equal to 2&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;print&lt;/span&gt;(&lt;span class=&quot;s5&quot;&gt;&quot;Too hot&quot;&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;case&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;...: &lt;/span&gt;// anything greater than or equal to 4&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;(&lt;/span&gt;&quot;Too cold&quot;&lt;span class=&quot;s3&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;default&lt;span class=&quot;s3&quot;&gt;:&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;(&lt;/span&gt;&quot;Justtttt right&quot;&lt;span class=&quot;s3&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p5&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s6&quot;&gt;temperature&lt;/span&gt;(planetNumber: &lt;span class=&quot;s4&quot;&gt;3&lt;/span&gt;) &lt;span class=&quot;s7&quot;&gt;// Earth&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s7&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Generic Subscripts&lt;/h3&gt;&lt;div&gt;subscript 를 더 잘 사용하기 위해 generic 을 지원합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #18b5b1}
span.s4 {color: #de3a3c}
span.s5 {color: #00aaa3}
span.s6 {color: #e7e8eb}
span.s7 {color: #51c34f}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;struct&lt;/span&gt; GenericDictionary&amp;lt;Key: &lt;span class=&quot;s2&quot;&gt;Hashable&lt;/span&gt;, Value&amp;gt; {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; data: [&lt;span class=&quot;s3&quot;&gt;Key&lt;/span&gt;: &lt;span class=&quot;s3&quot;&gt;Value&lt;/span&gt;]&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;init&lt;/span&gt;(data: [&lt;span class=&quot;s3&quot;&gt;Key&lt;/span&gt;: &lt;span class=&quot;s3&quot;&gt;Value&lt;/span&gt;]) {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;self&lt;/span&gt;.&lt;span class=&quot;s3&quot;&gt;data&lt;/span&gt; = data&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;subscript&lt;/span&gt;&amp;lt;T&amp;gt;(key: &lt;span class=&quot;s3&quot;&gt;Key&lt;/span&gt;) -&amp;gt; &lt;span class=&quot;s3&quot;&gt;T&lt;/span&gt;? {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;data&lt;/span&gt;[key] &lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;? &lt;span class=&quot;s3&quot;&gt;T&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; earthData = &lt;span class=&quot;s3&quot;&gt;GenericDictionary&lt;/span&gt;(data: [&lt;span class=&quot;s4&quot;&gt;&quot;name&quot;&lt;/span&gt;: &lt;span class=&quot;s4&quot;&gt;&quot;Earth&quot;&lt;/span&gt;,&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;population&quot;&lt;/span&gt;: &lt;span class=&quot;s5&quot;&gt;7500000000&lt;/span&gt;,&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;moons&quot;&lt;/span&gt;: &lt;span class=&quot;s5&quot;&gt;1&lt;/span&gt;])&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; name: &lt;span class=&quot;s2&quot;&gt;String&lt;/span&gt;? = &lt;span class=&quot;s3&quot;&gt;earthData&lt;/span&gt;[&lt;span class=&quot;s4&quot;&gt;&quot;name&quot;&lt;/span&gt;]&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; population: &lt;span class=&quot;s2&quot;&gt;Int&lt;/span&gt;? = &lt;span class=&quot;s3&quot;&gt;earthData&lt;/span&gt;[&lt;span class=&quot;s4&quot;&gt;&quot;population&quot;&lt;/span&gt;]&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s1&quot;&gt;extension&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt; &lt;/span&gt;GenericDictionary&lt;span class=&quot;s6&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;subscript&lt;/span&gt;&amp;lt;Keys: &lt;span class=&quot;s2&quot;&gt;Sequence&lt;/span&gt;&amp;gt;(keys: &lt;span class=&quot;s3&quot;&gt;Keys&lt;/span&gt;) -&amp;gt; [&lt;span class=&quot;s3&quot;&gt;Value&lt;/span&gt;] &lt;span class=&quot;s1&quot;&gt;where&lt;/span&gt; &lt;span class=&quot;s3&quot;&gt;Keys&lt;/span&gt;.&lt;span class=&quot;s2&quot;&gt;Iterator&lt;/span&gt;.&lt;span class=&quot;s2&quot;&gt;Element&lt;/span&gt; == &lt;span class=&quot;s3&quot;&gt;Key&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; values: [&lt;span class=&quot;s3&quot;&gt;Value&lt;/span&gt;] = []&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;for&lt;/span&gt; key &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt; keys {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; value = &lt;span class=&quot;s3&quot;&gt;data&lt;/span&gt;[key] {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;values.&lt;span class=&quot;s2&quot;&gt;append&lt;/span&gt;(value)&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt; values&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; nameAndMoons = &lt;span class=&quot;s3&quot;&gt;earthData&lt;/span&gt;[[&lt;span class=&quot;s4&quot;&gt;&quot;moons&quot;&lt;/span&gt;, &lt;span class=&quot;s4&quot;&gt;&quot;name&quot;&lt;/span&gt;]]&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;// [1, &quot;Earth&quot;]&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; nameAndMoons2 = &lt;span class=&quot;s3&quot;&gt;earthData&lt;/span&gt;[&lt;span class=&quot;s2&quot;&gt;Set&lt;/span&gt;([&lt;span class=&quot;s4&quot;&gt;&quot;moons&quot;&lt;/span&gt;, &lt;span class=&quot;s4&quot;&gt;&quot;name&quot;&lt;/span&gt;])]&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s7&quot;&gt;// [1, &quot;Earth&quot;]&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s7&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Miscellaneous&lt;/h2&gt;&lt;h3&gt;MutableCollection.swapAt(_:_:)&lt;/h3&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #18b5b1}
span.s4 {color: #00aaa3}
span.s5 {color: #51c34f}
span.s6 {color: #e7e8eb}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt; bubbleSort&amp;lt;T: &lt;span class=&quot;s2&quot;&gt;Comparable&lt;/span&gt;&amp;gt;(&lt;span class=&quot;s1&quot;&gt;_&lt;/span&gt; array: [&lt;span class=&quot;s3&quot;&gt;T&lt;/span&gt;]) -&amp;gt; [&lt;span class=&quot;s3&quot;&gt;T&lt;/span&gt;] {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; sortedArray = array&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;0&lt;/span&gt;..&amp;lt;sortedArray.&lt;span class=&quot;s2&quot;&gt;count&lt;/span&gt; - &lt;span class=&quot;s4&quot;&gt;1&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;for&lt;/span&gt; j &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;s4&quot;&gt;1&lt;/span&gt;..&amp;lt;sortedArray.&lt;span class=&quot;s2&quot;&gt;count&lt;/span&gt; {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;if&lt;/span&gt; sortedArray[j-&lt;span class=&quot;s4&quot;&gt;1&lt;/span&gt;] &amp;gt; sortedArray[j] {&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;sortedArray.&lt;span class=&quot;s2&quot;&gt;swapAt&lt;/span&gt;(j-&lt;span class=&quot;s4&quot;&gt;1&lt;/span&gt;, j) &lt;span class=&quot;s5&quot;&gt;// New MutableCollection method&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt; sortedArray&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s3&quot;&gt;bubbleSort&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;]) &lt;/span&gt;// [0, 1, 2, 3, 4]&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Associated Type Constraints&lt;/h3&gt;&lt;div&gt;associated types 를 where 절을 이용하여 제약할 수 있습니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e12da0; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #29a09f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #e7e8eb}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;protocol&lt;/span&gt; MyProtocol {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;associatedtype&lt;span class=&quot;s2&quot;&gt; Element&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;associatedtype&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; SubSequence : &lt;/span&gt;Sequence&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;where&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;SubSequence&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;Iterator&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;Element&lt;span class=&quot;s2&quot;&gt; == &lt;/span&gt;Iterator&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;Element&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Class and Protocol Existential&lt;/h3&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #e7e8eb}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;protocol&lt;/span&gt; MyProtocol { }&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; View { }&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; ViewSubclass: &lt;b&gt;&lt;span class=&quot;s2&quot;&gt;View&lt;/span&gt;, &lt;span class=&quot;s3&quot;&gt;MyProtocol&lt;/span&gt;&lt;/b&gt; { }&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;class&lt;/span&gt; MyClass {&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt; delegate: (&lt;b&gt;&lt;span class=&quot;s2&quot;&gt;View&lt;/span&gt; &amp;amp; &lt;span class=&quot;s3&quot;&gt;MyProtocol&lt;/span&gt;&lt;/b&gt;)?&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;}&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; myClass = &lt;span class=&quot;s2&quot;&gt;MyClass&lt;/span&gt;()&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;myClass&lt;span class=&quot;s4&quot;&gt;.delegate = &lt;/span&gt;ViewSubclass&lt;span class=&quot;s4&quot;&gt;()&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;NSNumber Bridging&lt;/h3&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; background-color: #292b36; min-height: 14.0px}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #29a09f}
span.s3 {color: #00aaa3}
span.s4 {color: #e7e8eb}
span.s5 {color: #18b5b1}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt; n = &lt;span class=&quot;s2&quot;&gt;NSNumber&lt;/span&gt;(value: &lt;span class=&quot;s3&quot;&gt;999&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; v = &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;? &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;UInt8&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; &lt;/span&gt;// Swift 4: nil, Swift 3: 231&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #de3a3c; background-color: #292b36}
span.s1 {color: #e7e8eb}
span.s2 {color: #29a09f}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #18b5b1; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #00aaa3}
span.s5 {color: #e7e8eb}
span.s6 {color: #de3a3c}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #e7e8eb; background-color: #292b36}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #51c34f; background-color: #292b36}
span.s1 {color: #e12da0}
span.s2 {color: #18b5b1}
span.s3 {color: #29a09f}
span.s4 {color: #00aaa3}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>iOS 개발/Swift</category>
      <category>dictionary</category>
      <category>set</category>
      <category>string</category>
      <category>swfit 3.0</category>
      <category>swfit 4.0</category>
      <category>Swfit string</category>
      <category>Swift</category>
      <category>Swift 4</category>
      <category>swift changes</category>
      <category>swift dictionary</category>
      <category>swift set</category>
      <category>swift 변경</category>
      <category>변경된 부분</category>
      <category>변경점</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/200</guid>
      <comments>https://beankhan.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 19 Sep 2017 12:04:08 +0900</pubDate>
    </item>
    <item>
      <title>[iOS] Contacts Framework 의 사용법 (CNContact, CNContactStore, Save/Fetch Contacts)</title>
      <link>https://beankhan.tistory.com/199</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;출처&lt;/h3&gt;&lt;div&gt;https://developer.apple.com/documentation/contacts&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;개요&lt;/h3&gt;&lt;div&gt;iOS 9 이상에서 지원되는 Contact Framework 로&lt;/div&gt;&lt;div&gt;대부분이 앱이 Contact 편집보다는 조회를 많이 하고 있기에,&lt;/div&gt;&lt;div&gt;thread-safe 와 read-only 사용에 optimize 되어있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Contact Object&lt;/h3&gt;&lt;div&gt;CNContact 은 thread-safe 하고 imuutable 한&amp;nbsp;&lt;/div&gt;&lt;div&gt;contact properties (name, image, phonenumber) 를 가지고있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px; width: 400px; height: 112px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99831133599293DE34&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99831133599293DE34&quot; width=&quot;400&quot; height=&quot;112&quot; filename=&quot;스크린샷 2017-08-15 오후 3.25.14.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 400px; height: 112px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CNContact 을 상속받은 CNMutableContact 은 mutable 한 속성을 가지고 있으며&lt;/p&gt;&lt;p&gt;contact properties 를 수정할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;contact properties 는 phone numbers, email,&amp;nbsp;&lt;/p&gt;&lt;p&gt;CNLabeledValue 를 가진 array 와 같은 multiple values 를 가진다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Label 는 thread-safe,&amp;nbsp;immutable tuple 속성을 가지며&lt;/p&gt;&lt;p&gt;home, work 와 같이 각각의 value 를 가리킨다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Create Contact Example&lt;/h4&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s2 {font-variant-ligatures: no-common-ligatures}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #272ad8}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;fileprivate&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; saveContact() -&amp;gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;Bool&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; contact = CNMutableContact()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;contact.givenName = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;John&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;contact.familyName = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;Appleseed&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; homeEmail = CNLabeledValue(label:CNLabelHome,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;value:&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;john@example.com&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;NSString&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; workEmail = CNLabeledValue(label:CNLabelWork,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;value:&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;j.appleseed@icloud.com&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;NSString&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;contact.emailAddresses = [homeEmail, workEmail]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; phoneNumberInfo = CNLabeledValue(label:CNLabelPhoneNumberiPhone,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;value:CNPhoneNumber(stringValue:&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;(408) 555-0126&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;))&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;contact.phoneNumbers = [ phoneNumberInfo ]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; homeAddress = CNMutablePostalAddress()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;homeAddress.street = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;1 Infinite Loop&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;homeAddress.city = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;Cupertino&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;homeAddress.state = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;CA&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;homeAddress.postalCode = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;95014&quot;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;contact.postalAddresses = [CNLabeledValue(label:CNLabelHome, value:homeAddress)]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; birthday = DateComponents()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;birthday.day = &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;1&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;birthday.month = &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;4&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;birthday.year = &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;1988&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;contact.birthday = birthday&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; store = CNContactStore()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; saveRequest = CNSaveRequest()&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;saveRequest.add(contact, toContainerWithIdentifier: &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; result = &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;false&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; store.execute(saveRequest)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;result = &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;true&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;} &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; error {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;print(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;error occured : &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;error.localizedDescription&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; result&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;br class=&quot;Apple-interchange-newline&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Formatting and Localization&lt;/h3&gt;&lt;div&gt;Contact Framework 는 contact 정보에 대한&amp;nbsp;&lt;/div&gt;&lt;div&gt;formatting 과 localize 를 지원한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;contact name formatting 은 CNContactFormatter 로&lt;/div&gt;&lt;div&gt;international postal address 는&amp;nbsp;&lt;/div&gt;&lt;div&gt;CNPostalAddressFormatter 를 이용하면된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Name and postal address Formating Example&lt;/h4&gt;&lt;div&gt;&lt;p class=&quot;p1&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;&amp;nbsp;contact =&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;CNMutableContact&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;()&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;contact.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;givenName&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;John&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;contact.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;familyName&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;Appleseed&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;fullName =&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;CNContactFormatter&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: rgb(209, 47, 27);&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;(from: contact, style: .&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: rgb(209, 47, 27);&quot;&gt;fullName&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s6&quot; style=&quot;color: rgb(209, 47, 27);&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;(fullName ??&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;// John Appleseed&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;homeAddress =&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;CNMutablePostalAddress&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;()&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;homeAddress.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;street&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;1 Infinite Loop&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;homeAddress.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;Cupertino&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;homeAddress.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;CA&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;homeAddress.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;postalCode&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;&quot;95014&quot;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;contact.&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;postalAddresses&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;= [&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;CNLabeledValue&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;(label:&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;CNLabelHome&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;, value:homeAddress)]&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&amp;nbsp;postalString =&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;CNPostalAddressFormatter&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: rgb(209, 47, 27);&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;(from: homeAddress,&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;style: .&lt;/span&gt;&lt;span class=&quot;s6&quot; style=&quot;color: rgb(209, 47, 27);&quot;&gt;mailingAddress&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s6&quot; style=&quot;color: rgb(209, 47, 27);&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;(postalString)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;// 1 Infinite Loop&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;// Cupertino&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s7&quot;&gt;// CA&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s7&quot;&gt;// 95014&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CNContact 의 localizedString(forKey:) 와&amp;nbsp;&lt;/p&gt;&lt;p&gt;CNLabeledValue.localizedString(forLabel:) 등을 이용하여&lt;/p&gt;&lt;p&gt;device 의 current locale setting 에 따른 localizing 을 지원할 수 있다.&lt;/p&gt;&lt;/div&gt;&lt;h4&gt;Localizing a given name Example&lt;/h4&gt;&lt;div&gt;&lt;p class=&quot;p1&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;// device locale is Spanish&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;&amp;nbsp;displayName = CNContact.localizedString(forKey: CNContactNicknameKey)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;print(displayName)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;// alias&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot; style=&quot;color: rgb(112, 61, 170);&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;&amp;nbsp;displayLabel = CNLabeledValue&amp;lt;&lt;/span&gt;&lt;span class=&quot;s4&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;NSString&lt;/span&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;&amp;gt;.localizedString(forLabel: CNLabelHome)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot; style=&quot;color: rgb(186, 45, 162);&quot;&gt;print(displayLabel)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s5&quot; style=&quot;color: rgb(62, 30, 129);&quot;&gt;// casa&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Fetching Contact&lt;/h3&gt;&lt;div&gt;CNContactStore 를 이용해서 contact 을 fetch 할 수 있다.&lt;/div&gt;&lt;div&gt;CNContactStore 는 모든 I/O operation 을 가지고 있고,&lt;/div&gt;&lt;div&gt;contact 과 group 의 fetching, saving 을 담당한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;CNContactStore 의 method 들은 모두 synchronous 하기 때문에&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;background thread 에서 작업하는 것이 좋다.&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;필요하면 immutable 한 fetch result 를 안전하게 main thread 로&lt;/p&gt;&lt;p&gt;callBack 을 줄 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Contact framework 는 contact 을 fetch 하기위해&lt;/p&gt;&lt;p&gt;predefined 된 predicates 와 keysToFetch property 와 같은&lt;/p&gt;&lt;p&gt;몇 가지 방법을 제공한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;contact 을 filtering 하기 위한 몇가지 predicate 중&amp;nbsp;&lt;/p&gt;&lt;p&gt;하나는 이름을 통한 검색이 있다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;predicateForContacts(matchingName:)&lt;/b&gt; 을 이용하면 된다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;u&gt;포괄적이거나 compound predicates 는 제공되지 않는다.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;keysToFetch&lt;/b&gt; 는 가져오는 contact properties 를 지정할 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Fetch Example&amp;nbsp;&lt;/h4&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;fetch 도중 error 가 발생했다면 return 값은 nil 로,&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;조건에 맞는 contact 이 없었다면 empty array 로&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;값이 반환된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; store = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNContactStore&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;()&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; results: [&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNContact&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;]?&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; fetchPropertes = [&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;CNContactGivenNameKey&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;CNContactFamilyNameKey&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;]&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; predicate = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNContact&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;predicateForContacts&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(matchingName: &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;&quot;Appleseed&quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;results = &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; store.&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;unifiedContacts&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(matching: predicate,&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;keysToFetch: fetchPropertes &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNKeyDescriptor&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;])&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; error {&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;&quot;error occured! : &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;error.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;localizedDescription&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s5&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(results ?? &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Fetch Example Using Key Descriptor&lt;/h4&gt;&lt;div&gt;Fetch 결과에 formatting 된&amp;nbsp;결과를 받을수도 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; keysToFetch = [&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNContactEmailAddressesKey&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNKeyDescriptor&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;,&lt;/span&gt;&lt;/p&gt;&lt;p&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s3 {font-variant-ligatures: no-common-ligatures}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
&lt;/style&gt;



&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNContactFormatter&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;descriptorForRequiredKeys&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;(for: .&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;fullName&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;)]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Privacy&lt;/h3&gt;&lt;div&gt;기본적으로 App 마다 권한을 키고 끌 수 있는데,&lt;/div&gt;&lt;div&gt;권한체크 없이 CNContactStore 의 어떤 call 이라도 불린다면&lt;/div&gt;&lt;div&gt;user 에게 grant / deny 여부를 물어보고, app 은 block 된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;권한 요청 시 최초 1번 system alert 이 노출되고&lt;/div&gt;&lt;div&gt;이후 grant/deny 여부는 CNContactStore 의 requestAccess 를 통해 알 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;iOS 10 부터 plist 에&lt;/b&gt; &lt;b&gt;NSContactsUsageDescription&lt;/b&gt; 을 반드시 등록해줘야한다.&lt;/div&gt;&lt;div&gt;해당 description은 권한 요청 시 system alert 에 message 와 함께&amp;nbsp;노출된다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;권한 요청은 아래와같이 한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s3 {font-variant-ligatures: no-common-ligatures}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; store = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNContactStore&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;()&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s3&quot;&gt;store.&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;requestAccess&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;(for: .&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;contacts&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;) { (result, error) &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span style=&quot;color: rgb(186, 45, 162); font-variant-ligatures: no-common-ligatures;&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Partial Contacts&lt;/h3&gt;&lt;div&gt;partial contact 은 contact store 로부터&amp;nbsp;&lt;/div&gt;&lt;div&gt;fetch 된 몇가지 property value 만 가진 것을 말한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;모든 fetched contact 은 partial contacts 이다.&lt;/div&gt;&lt;div&gt;만약 fetch 되지 않은 다른 property 를 접근한다면&lt;/div&gt;&lt;div&gt;exception 이 발생할 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;contact 에서 fetch 되었는지 안되었는지 알 수 없다면&lt;/div&gt;&lt;div&gt;해당 property 에 접근할 수 있는지&amp;nbsp;&lt;/div&gt;&lt;div&gt;isKeyAvailable, areKeysAvailable&amp;nbsp;을 이용해서 확인할 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
span.s4 {font-variant-ligatures: no-common-ligatures}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}
span.s6 {font-variant-ligatures: no-common-ligatures; color: #703daa}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; (contact.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;isKeyAvailable&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNContactPhoneNumbersKey&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)) {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;contact.&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;phoneNumbers&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;//Refetch the keys&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; keysToFetch = [&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNContactGivenNameKey&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNContactFamilyNameKey&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNContactPhoneNumbersKey&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; refetchedContact: &lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;CNContact?&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p4&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;refetchedContact = &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; store.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;unifiedContact&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;(withIdentifier: contact.&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;identifier&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;,&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;keysToFetch: keysToFetch &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;CNKeyDescriptor&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;])&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;} &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt; error {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;error occured! :&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;error.&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;localizedDescription&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s4&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Unified Contacts&lt;/h3&gt;&lt;div&gt;다른 계정에 있는 Contacts 은 자동으로 link 되어&lt;/div&gt;&lt;div&gt;같은 사람처럼 보일 수 있다. (unified contact)&lt;/div&gt;&lt;div&gt;Unified Contact 은 merge 되어 하나의 contact 처럼 보이는&amp;nbsp;&lt;/div&gt;&lt;div&gt;임시적인 View 이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 450px; width: 450px; height: 178px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/990971335992B9BB1C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F990971335992B9BB1C&quot; width=&quot;450&quot; height=&quot;178&quot; filename=&quot;22a1fdf3-3b73-4362-ae31-00c04c80d62d.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 450px; height: 178px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;기본적으로 Contact framework 는 unified contacts 를 반환한다.&lt;/div&gt;&lt;div&gt;fetch 된 unified contact 은 묶인 연락처들의 identifier 가 아닌&lt;/div&gt;&lt;div&gt;unique 한 identifier 를 가진다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3&gt;Saving Contacts&lt;/h3&gt;&lt;div&gt;CNContactStore 은 modify contact 도 지원한다.&lt;/div&gt;&lt;div&gt;CNSaveRequest 는 save 뿐만 아니라&lt;/div&gt;&lt;div&gt;여러개 contact 과 group &amp;nbsp;의 변경사항도 single operation 으로 저장할 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;하나의 saveRequest 에 모든 contact 변경사항을 add 한 뒤 execute 할 수 있다.&lt;/div&gt;&lt;div&gt;&lt;b&gt;saveRequest 에 있는 contact 들은 변경 중이기 때문에&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;save 가 실행되는 중에 접근해서는 안된다.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Save New Contact Example&lt;/h4&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
span.s1 {font-variant-ligatures: no-common-ligatures}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s6 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;// Creating a new contact&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; newContact = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNMutableContact&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;()&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;newContact.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;givenName&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;John&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;newContact.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;familyName&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;Appleseed&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p3&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;// Saving contact&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; saveRequest = &lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;CNSaveRequest&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;()&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;saveRequest.&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(newContact, toContainerWithIdentifier: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;nil&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; store.&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(saveRequest)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt; error {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;print(&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;error.localizedDescription&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s1&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Saving a Modified Contact&lt;/h4&gt;&lt;div&gt;




&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s2 {font-variant-ligatures: no-common-ligatures}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}
&lt;/style&gt;


&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; mutableContact = contact.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;mutableCopy&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;! &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNMutableContact&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; newEmail = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNLabeledValue&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(label: &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNLabelHome&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, value: &lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;john@example.com&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;NSString&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;mutableContact.&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;emailAddresses&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(newEmail)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; saveRequest = &lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;CNSaveRequest&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;()&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;saveRequest.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(mutableContact)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p2&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s1&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; store.&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(saveRequest)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; error {&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;error.&lt;/span&gt;&lt;span class=&quot;s4&quot;&gt;localizedDescription&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;)&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;p1&quot;&gt;&lt;span class=&quot;s2&quot;&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Contact Changed Notifications&lt;/h3&gt;&lt;div&gt;Save 에 성공한 이후 contact store 는&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;b&gt;CNContactStoreDidChange&lt;/b&gt; notification 을 posting 한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;만약 Contacts framework 의 object 를 cache 하고 있었다면&lt;/div&gt;&lt;div&gt;identifier 를 사용하거나 원래 사용했던 predicate 를 이용해서&lt;/div&gt;&lt;div&gt;객체를 다시 가져온 다음 캐시된 객체를 release 해줘야한다.&lt;/div&gt;&lt;div&gt;cache 된 객체는 invalid 하지는 않지만 stale (이전 상태) 이다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;Containers and Groups&lt;/h3&gt;&lt;div&gt;User 는 device 의 local account 나&lt;/div&gt;&lt;div&gt;동기화를 위한 server account (google, icloud) 를 가지고 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;각각의 계정은 최소 하나 이상의 contact container 를 가지고 있다.&lt;/div&gt;&lt;div&gt;연락처는 하나의 container 에 속할 수 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px; width: 400px; height: 220px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99BB74335992B97114&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99BB74335992B97114&quot; width=&quot;400&quot; height=&quot;220&quot; filename=&quot;b69775e0-f596-4fbc-86db-f5385987d803.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 400px; height: 220px;&quot; original=&quot;yes&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;groupd 은 container 내부에서의 연락처 set 이다.&lt;/div&gt;&lt;div&gt;모든 계정이 group 을 지원하지는 않고&amp;nbsp;&lt;/div&gt;&lt;div&gt;몇몇 계정은 subgroups 도 지원한다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;iCloud 계정은 하나의 container 를 가지고 많은 group 을 가질 수 있지만&lt;/div&gt;&lt;div&gt;subgroup 은 지원하지 않는다.&lt;/div&gt;&lt;div&gt;반면, Exchange 계정은 group 을 지원하지는 않지만&lt;/div&gt;&lt;div&gt;Exchange Folder 로 표현되는 여러개의 container 를 가지고 있다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p style=&quot;text-align: left; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 400px; width: 400px; height: 220px;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994D6B335992B99619&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994D6B335992B99619&quot; width=&quot;400&quot; height=&quot;220&quot; filename=&quot;11862e29-90ab-4232-bfb0-744f3a51c435.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;width: 400px; height: 220px;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s3 {font-variant-ligatures: no-common-ligatures}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}
span.s6 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
span.s7 {font-variant-ligatures: no-common-ligatures; color: #008400}
&lt;/style&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
span.s1 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s2 {font-variant-ligatures: no-common-ligatures}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #008400}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;style type=&quot;text/css&quot;&gt;
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; min-height: 13.0px}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa}
span.s1 {font-variant-ligatures: no-common-ligatures}
span.s2 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}
span.s3 {font-variant-ligatures: no-common-ligatures; color: #703daa}
span.s4 {font-variant-ligatures: no-common-ligatures; color: #000000}
span.s5 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}
span.s6 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}
&lt;/style&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>iOS 개발/iOS</category>
      <category>CNContact</category>
      <category>CNContactStore</category>
      <category>CNlabeledValue</category>
      <category>CNMutableContact</category>
      <category>CNSvaeRequest</category>
      <category>Contact</category>
      <category>Contact Changed Notification</category>
      <category>Contact Formatting</category>
      <category>Contact Localizing</category>
      <category>contacts</category>
      <category>Contacts Framework</category>
      <category>Containers and Groups</category>
      <category>Fetch Contact</category>
      <category>ios 9</category>
      <category>Modify Contact</category>
      <category>Partial Contact</category>
      <category>Save Contact</category>
      <category>Unified Contact</category>
      <category>연락처</category>
      <category>연락처 계정</category>
      <category>연락처 권한</category>
      <category>연락처 그룹</category>
      <category>연락처 저장</category>
      <category>연락처 조회</category>
      <author>beankhan</author>
      <guid isPermaLink="true">https://beankhan.tistory.com/199</guid>
      <comments>https://beankhan.tistory.com/199#entry199comment</comments>
      <pubDate>Tue, 15 Aug 2017 17:10:13 +0900</pubDate>
    </item>
  </channel>
</rss>