Skip to content

Week3 assignment

박성준 edited this page Feb 19, 2019 · 12 revisions

개인별 👨‍💻

자신이 만든 버튼 클래스를 라이브러리로 사용할 수 있도록 CocoaPods에 등록

모둠별 🤝

Q1. 스위프트에 옵셔널은 왜 존재할까?

  • 스위프트의 옵셔널은 잠재적 오류를 다루는 방법으로 변수에 nil을 직접 할당하는 방식이 아니라 옵셔널을 사용한다.
  • 옵셔널은 값이 없는 것이 아니라 다른 값을 감싸도록 만들어져서 값이 없는 상황에도 오류를 발생하게 하지 않기 때문에 프로그램의 안정성을 높일 수 있다.

Q2. WWDC 2018의 세션 중 관심가는 세션 2개의 내용을 요약하고 , 이 기능이 내 프로젝트 또는 다른 앱에 어떤 방식으로 적용할 수 있을지 그것이 사용자와 시장에 어떤 영향을 미치게 될지 정리해보기

Introduction to Siri Shortcuts

Author: 성준

WWDC2018-Session211 - iOS, watchOS

Intro

  • Siri Shortcuts은 iOS12의 파워풀한 새로운 기능입니다. 이는 Siri를 이용해 앱의 기능을 표출할 수 있도록 가능하게 해줍니다.
  • 또한 Siri가 Shortcut의 사용 빈도를 체크해 적절하게 제안할 수도 있습니다.
  • Shortcuts는 Siri에 음성 구절을 추가해 iOS, HomePod 그리고 watchOS에서 적용시킬 수 있습니다.

Creating Shortcuts

Define Shortcut -> donate shortcout -> handle shortcut

  • Define Shortcut
    • 언제, 어떤 Shortcut을 사용할 지 앱 안에 정의한다.
  • Donate Shortcut
    • Siri를 통해 사용자들이 Shortcut을 사용하기 위해, 개발자가 정의한 지름길(기능이 수행되는 시나리오)을 사용자의 Shortcut에 donate 해야한다. (기부한다라는 표현이 Offical이지만, 제공해준다도 맞는 표현 같다.)
  • Handle Shortcut
    • 제공된 Shortcut의 Response 또는 다음 액션에 대해 Handling 할 수 있다.

What Makes a Great Shortcut?

  • 사용자가 앱의 핵심기능을 사용할 수 있도록 가속시켜 준다.
  • 사용자가 계속해서 관심을 가지게 해준다.
  • 언제든지 실행 가능한 것

Shortcuts APIs

NSUserActivity

  • 검색 결과나 Handoff를 통하여 사용자가 앱을 사용하던 상태를 저장 복원하기 위해 사용하는 간편한 방법 (마치 PCB!)

  • 사용한다면 가능한 것 들

    • 너의 앱에서 무언가를 열 수 있게 해준다.
    • Spotlight나 Handoff를 위해 제공하는 아이템을 나타낼 수 있다.
  • Activity Types

    • 각 NSUserActivity는 고유한 activityType을 가진다.
    • 이 타입을 통해 다양한 액션들을 처리 할 수 있도록 해준다.

Intents

  • SiriKit과의 상호작용을 하기위한 Extension

  • 사용한다면 가능한 것들

    • Siri의 Voice Response를 Custom 할 수 있다.
    • 물론 View Response도 Custom 할 수 있다.
  • SiriKit에는 다음과 같은 Default 기능들이 내장되어 있다. (SiriKit은 아래 기능들 밖에 사용하지 못한다...)

    • Messaging
    • Climate and Radio
    • Photo Search
    • Notebook
    • Payments
    • VOIP Calling
    • Car Commands
    • Lists
    • Ride Booking
    • Workouts

하지만 Intents는 SiriKit Custom이 가능하다!!!

Demo - Soup Chef (10분 40초)

Soup Chef Example

Intents.intentdefinition

Parameters

  • Siri에게 넘기고자 하는 인자들을 정의하는 곳 Shortcut Types
  • Siri가 알아들을 수 있도록 필요한 단어를 지정하는 곳

Intents Extension

Intent Handling Notes

  • 앱을 실행하지 않고도 백그라운드에서 Shortcut을 실행시킬 수 있다.
  • 당신이 의도한 Intents Extension 시점이 있더라도, -continueUserActivity는 항상 실행된다.

INRelevantShortcut

  • Siri Watch Face를 Shortcuts로 표현하기 위한 객체이다.
  • 선택적으로, 너의 shortcuts이 Watch Face에 보일 때 정보들을 포함시켜 보이게 할 수 있다.
  • 물론 Watch App이 없다하더라도 동작시킬 수 있다. (일반 iOS App에서도 가능하단 말인데 왜 Siri Watch Face에서 라고 처음에 언급하는지 모르겠다...)

Shortcut Suggested

  • 사용자가 반복적으로 이용했던 Shortcut을 Siri 제안을 통해 추천해 준다.

How is a Shortcut Suggested?

  • requiredUserInfoKeys
    • Restoration을 위한 최소한의 정보를 이용해 패턴을 찾아냅니다.
    • 과거에 불러졌던 shortcut의 count를 센다!

Media Shortcuts

  • Play Media Intent

    • 백그라운드에서 앱이 실행 가능하다.
    • 잠금화면에서 Playboack Control을 보여줄 수 있다.
    • Homepod에서 작동 가능하다.
  • Upcoming Media

    • INUpcomingMedia API를 사용한다면 새로운 미디어나 사용자가 소비하지 않은 콘텐츠를 제안해 줄 수 있다.
    • podcasts와 TV Shows에 매우 잘 맞는다.

Summary

  • Shortcut은 파워풀한 새로운 경험을 가능하게 해줍니다.
  • 사용자들을 새로운 경로로 유입되게 할 수 있습니다.
  • NSUserActivity 또는 Intents를 Shortcut에 적용시킬 수 있습니다.

Siri Shortcuts에 대한 개인적인 생각

Siri Shortcuts에 대한 개인적인 생각

  • 결론부터 말하자면 SiriKit + Shortcuts는 엄청난 시너지를 내는 것 같다.
  • SiriKit은 이전에 한정된 기능(ex. messaging, payment...)만 제공했었기에 개인 비서라고 불리기엔 부족한 점이 많았다.
  • 그러나 Shortcut의 Intents Extension을 SiriKit과 연동시키니 APP을 서비스하는 입장에서 서비스를 제공할 수 있는 방법이 다양해진 것 같다.
  • 이로 인해 영상 중반에 Speaker가 언급했듯이, 사용자들을 서비스로 유입시킬 수 있는 새로운 길을 개척했다고 볼 수 있을 것 같다.
  • 앱을 굳이 실행시키지 않더라도, 말 한마디면 원하는 기능이 모두 저절로 작동하니까!
    • 너무나도 편한 기능인데, Siri Shortcuts을 적용시킨 서비스가 별로 없다보니 아직 많이 보편화가 되지 않았다고 생각한다.

TREE 앱에 적용 시킬 수 있는 부분

  • 급상승 검색어

    • 현재 LIVE 탭에 급상승 검색어를 국가별로 제공하고 있다.
    • 우리가 보통 네이버나 다음 웹사이트를 방문하더라도 거의 제일먼저 확인해보는 것이 실시간 검색어 일 것이다.
    • 이 국가별 실시간 검색어를 앱을 실행시키지 않고도, 웹사이트에서 국가를 바꾸지 않아도 간단하게 확인해볼 수 있다면 정말 유용할 것 같다.
  • 해당 급상승 검색어 또는 주요 이슈에 대한 관련 기사

    • Intents UI Extension의 한정된 View 크기로는 문제가 있지만, 번거로운 앱 프로세스를 거치지 않고도, 기사를 쉽게 확인 할 수 있도록 할 수 있을 것이다.

다른 팀에 적용 시켜볼 수 있는 부분

  • 경조사 팀

    • Siri Shortcuts와 가장 잘 맞는 서비스라고 생각한다.
    • 경조사를 등록하는 프로세스를 SiriKit으로 한번에 시켜준다면 매번 손으로 입력해야 된다는 번거로움을 해소할 수 있지 않을까 싶다.
  • 미세먼지 팀

    • 위젯도 분명 미세먼지를 알려줄 수 있는 좋은 기능이지만, Siri로 현재 기상 상태를 알려주고 간단한 Response Templete을 적용한다면 더 사용자 친화적일 것 같다.

Swift Generics (Expanded)

Author: 혜리

WWDC 2018 Generic Extension

  • Swift Generic

    • Swift 1.0 - Generic types / Generic functions
    • Swift 2.0 - Protocol extensions / Default impletmentations
    • Swift 3.0 - Protocol operators / Generic typealiases
    • Swift 3.1 - Nested generic types / Concrete type constraints
    • Swift 4.0 - Associated type where clauses / Generic subscripts
    • Swift 4.1 Conditional conformance / Recursive constraints
  • Generic

제네릭은 Swift에서 가장 강력한 기능 중 하나로 Swift 표준 라이브러리 대다수는 제네릭 코드로 만들졌습니다.

  • 버퍼 struct
struct Buffer {
    var count: Int
	
    subscript(at: Int) -> Any {
		
    }
}
  • Q. 각 요소를 index로 가져오는 방법이 있지만 리턴 타입을 무엇으로 만들어야 할까요?

    • A. Generic이 없다면 우리가 버퍼에 넣고 싶은 것을 표현할 수 있는 타입인 Any로 넣어야합니다.
  • Any로 넣게되면 그 유형을 꺼내서 사용해야한다. 또한 오류가 발생하기 쉽습니다.

    • 예를들어 문자열의 버퍼에 정수를 넣으면 ? Oh No 😭!!!!!
  • Q.어떻게 메모리에 표현될까?

    • ㅁ-ㅁ-ㅁ-ㅁ-ㅁ 이런 느낌 ..

    • 문자열 버퍼를 이상적으로 표현하면 모든 요소가 나란히 연속적인 메모리 블록이됩니다.

    • type이 지정되지 않은 접근 방식을 사용하면 이 방법이 효과가 없습니다.

      • 왜나면 버퍼는 어떤 종류의 타입을 포함할지 미리 알지 못하기 때문입니다.
    • Any를 사용하면 tracking과 boxing 및 unboxing에 많은 오버헤드가 있습니다.

    • 따라서 사용의 용이성과 정확성 뿐 아니라 성능상의 문제가 발생한다.

struct Buffer<Element> {
    var count: Int
	
    subscript(at: Int) -> Element {
		
    }
}
  • Element는 컴파일러가 버퍼에 무엇을 포함 할 것인지를 알려주는 컴파일 타임 argument라고 생각하면 됩니다.

  • 버퍼에서 Element를 가져올 때 따로 Any와 같이 변환 할 필요가 없습니다.

  • 예를들어 스트링 버퍼에 정수를 넣으면 ? 즉 실수를 한 경우 컴파일러가 에러를 발생시킵니다.

    • 컴파일러가 Element 내용이 무엇이여야하는지 추측이 가능하기 때문이다.
    • there's no such type as buffer without an associated element type.
  • 즉 제네릭을 사용하면 오버헤드없이 연속적인 메모리 블록에 모든 Element를 보유합니다.

    • 사용의 용이성과 정확성 👍

Summary

  • Generic을 활용해 다양한 데이터 타입을 처리할 수 있습니다.
  • 재사용가능한 함수와 타입이 어떤 타입과 작업할 수 있도록 요구사항을 정의할 수 있습니다.
  • 의도를 명확하게 표현하고 추상적인 방법으로 코드를 작성할 수 있습니다.

TREE 앱에 적용 시킬 수 있는 부분

  • ArticleViewer
    • Search, Live, Scrap에서 뷰어를 사용하는데 각각의 데이터 타입이 있기 때문에 이 부분에서 제네릭을 활용하면 코드 중복을 줄일 수 있을 것 같습니다.
  • APIManager
    • Generic을 활용하여 코드 중복을 줄일 수 있습니다. (예시: Result)

다른 팀에 적용 시켜볼 수 있는 부분

  • 경조사
    • 동일한 기능을 구현하는데 타입이 여러 가지인 함수가 많을 것입니다. 그럴 때 타입마다 함수를 구현하지 않고 제네릭을 활용하여 관련 타입을 위한 (where) 요구 사항을 정의하여 사용하면 유용할 것입니다.