SlideShare a Scribd company logo
let swift(16)
Protocol Oriented
Programming
POP in Swift
조성규
Contents
Protocol Oriented Programming Overview
POP & Value in Project
Model, View, Controller with POP & Value
Advantage
Limitation
Summary
Protocol Oriented Programming
Protocol in Objective-C
단지 기능의 청사진의 역할을 수행
주로 Delegate, DataSource 등으로 이용
기본 구현 (Default Implementation) 불가
카테고리 적용 불가
Protocol in Swift
Objective-C의 프로토콜 기능은 기본
기본 구현(Default Implementation) 가능
Protocol + Extension = Protocol extension
특정 타입이 할 일 지정 + 구현을 한 방에!
Protocol extension
protocol LayoutDrawable {
func drawSomeLayout()
}
class MyView: UIView, LayoutDrawable {
func drawSomeLayout() {
// Draw some layout...
}
}
Protocol extension
protocol LayoutDrawable {
func drawSomeLayout()
}
extension LayoutDrawable {
}
class MyView: UIView, LayoutDrawable {
func drawSomeLayout() {
// Draw some layout...
}
}
Protocol extension
protocol LayoutDrawable {
func drawSomeLayout()
}
extension LayoutDrawable {
func drawSomeLayout() {
// Draw some layout...
}
}
class MyView: UIView, LayoutDrawable {
}
Protocol 

Default Implimentation
Protocol extension
protocol LayoutDrawable {
func drawSomeLayout()
}
extension LayoutDrawable {
func drawSomeLayout() {
// Draw some layout...
}
}
extension UIView: LayoutDrawable { }
extension SKNode: LayoutDrawable { }
Idea from…
상속의 한계
서로 다른 클래스에서 상속받은 클래스는 동일한 기능
을

구현하기 위해 중복코드 발생
카테고리의 한계 및 부작용
프로퍼티 추가 불가
오직 클래스에만 적용 가능
기존 메서드를 (자신도 모르게) 오버라이드 가능
Protocol 

Default Implimentation
Idea from…
참조타입의 한계
동적 할당과 참조 카운팅에 많은 자원 소모
Using Value Type
class
Person
struct
Turtle
struct
Frog
class
Bird
struct
Fish
protocol
Runable
protocol
Flyable
protocol
Swimable
protocol
Talkable
class
Person
struct
Turtle
struct
Frog
class
Bird
struct
Fish
protocol
Runable
protocol
Flyable
protocol
Swimable
protocol
Talkable
protocol
Runable
protocol
Swimable
protocol
Swimable
protocol
Swimable
class
Person
struct
Turtle
struct
Frog
class
Bird
struct
Fish
protocol
Runable
protocol
Flyable
protocol
Swimable
protocol
Talkable
protocol
Runable
protocol
Swimable
protocol
Swimable
protocol
Swimable
Default Implimentation
(Extension)
여기까지…
Protocol-Oriented Programming in Swift
(#WWDC15, 408)
So WHAT??
어떻게 써먹으라고?
“POP 그것이 알고싶다”
지금부터 시작합니다!
POP & Value in Project
Social Networking Service
POP & Value in Project
Social Networking Service
Social Media
타임라인을 나타낼 수 있는 테이블 뷰 컨트롤러를 구성해 봅니다
“테이블 뷰 형식의 타임라인이 필요해요”
Protocol Oriented Programming in Swift
Protocol Oriented Programming in Swift
class TimelineTableViewCell: UITableViewCell {
var mediaImageView: UIImageView
var note: UILabel
var content: NSDictionary
}
class TimelineTableViewController: UITableViewController {
var contents: [NSDictionary]
}
class DetailViewController: UIViewController {
var mediaImageView: UIImageView
var note: UILabel
var content: NSDictionary
}
“성규씨, 정말 간단한 기능이 더 필요해요”
사진첩 처럼 볼 수 있는 모드를 추가할 수 있을까요?
“성규씨, 정말 간단한 기능이 더 필요해요”
사진첩 처럼 볼 수 있는 모드를 추가할 수 있을까요?
……………………
어찌 합니까
어떻게 할까요
무엇부터?
Model with POP & Value
Table View Cell











Collection View Cell
Content Model
class Content {
var URLString: String
var note: String
}
struct Content {
var URLString: String
var note: String
}
Model Property
class TimelineTableViewController: UITableViewController {
var contents: [Content]
// …
}
class TimelineCollectionViewController: UITableViewController {
var contents: [Content]
// …
}
Model Property
class TimelineTableViewController: UITableViewController,
ContainContents {
var contents: [Content]
// …
}
class TimelineCollectionViewController: UITableViewController ,
ContainContents {
var contents: [Content]
// …
}
protocol ContainContents {
var contents: [Content] { get }
}
Model Property
class TimelineTableViewController: UITableViewController,
ContainContents { … }
class TimelineCollectionViewController: UITableViewController,
ContainContents { … }
protocol ContainContents {
var contents: [Content] { get }
}
class TimelineContentObject {
static let shared = TimelineContentObject()
var contents: [Content] = [Content]()
}
extension ContainContents {
var contents: [Content] {
return TimelineContentObject.shared.contents
}
}
View with POP & Value
Table View Cell











Collection View Cell

Detail View Controller’s view
View
protocol MediaContainer: class {
var content: Content? { get set }
var media: UIImageView { get }
var note: UILabel { get set }
func contentChanged()
}
extension MediaContainer {
func contentChanged() {
// Update view...
}
}
View
class TimelineTableViewCell: UITableViewCell,
MediaContainer {
var media: UIImageView
var note: UILabel
var content: Content? {
didSet {
contentChanged()
}
}
}
class TimelineCollectionViewCell: UICollectionViewCell,
MediaContainer {
var media: UIImageView
var note: UILabel
var content: Content? {
didSet {
contentChanged()
}
}
}
View
class DetailViewController: UIViewController,
MediaContainer {
var media: UIImageView
var note: UILabel
var content: Content? {
didSet {
contentChanged()
}
}
}
Protocol Oriented Programming in Swift
Controller with POP & Value
Controller
protocol CanShowDetailView {
func showDetailView(withContent content: Content)
var navigationController: UINavigationController? { get }
}
extension CanShowDetailView {
func showDetailView(withContent content: Content) {
// Show detail view...
}
}
Controller
class TimelineTableViewController: UITableViewController,
ContainContents, CanShowDetailView {
…
}
class TimelineCollectionViewController: UITableViewController,
ContainContents, CanShowDetailView {
}
Protocol Oriented Programming in Swift
“이건 진짜 간단한건데요!!”
사진 말고 영상도 보여줄 수 없을까요?
“이건 진짜 간단한건데요!!”
사진 말고 영상도 보여줄 수 없을까요?
……………………
Refactoring
Table View Cell











Collection View Cell

Detail View Controller’s view
Image or Video
Protocol
protocol MediaContainer: class {
var content: Content? { get set }
var media: UIImageView { get }
var note: UILabel { get set }
func contentChanged()
}
extension MediaContainer {
func contentChanged() {
// Update view...
}
}
Protocol
protocol ContentPresentable: class, Layout {
var frame: CGRect { get set }
var canPresentContent: Bool { get }
}
extension ContentPresentable {
var canPresentContent: Bool {
return true
}
}
extension UIImageView: ContentPresentable { }
extension AVPlayerLayer: ContentPresentable { }
Protocol / Model
protocol MediaContainer: class {
var content: Content? { get set }
var media: UIImageView { get }
var note: UILabel { get set }
func contentChanged()
}
extension MediaContainer {
func contentChanged() {
// Update view...
}
}
struct Content {
var URLString: String
var note: String
}
Protocol / Model
protocol MediaContainer: class {
var content: Content? { get set }
var media: ContentPresentable { get }
var note: UILabel { get set }
func contentChanged()
}
extension MediaContainer {
func contentChanged() {
// Update view...
}
}
struct Content {
enum MediaType {
case image, video
}
var type: Content.MediaType
var URLString: String
var note: String
}
Protocol / Model
protocol MediaContainer: class {
var content: Content? { get set }
var media: ContentPresentable { get }
var note: UILabel { get set }
var videoLayer: AVPlayerLayer { get }
var mediaImageView: UIImageView { get }
func contentChanged()
}
extension MediaContainer {
func contentChanged() {
// Update view...
}
}
struct Content {
enum MediaType {
case image, video
}
var type: Content.MediaType
var URLString: String
var note: String
}
Protocol
extension MediaContainer {
func contentChanged() {
// Update view...
}
}
extension MediaContainer {
func contentChanged() {
// Update view...
}
var media: ContentPresentable {
switch content!.type {
case .image:
return mediaImageView
case .video:
return videoLayer
}
}
}
Protocol Oriented Programming in Swift
Advantage
Advantage
범용적인 사용
클래스, 구조체, 열거형 등등 모든 타입에 적용 가능
제네릭과 결합하면 더욱 파급적인 효과

(Type safe & Flexible code)
Advantage
상속의 한계 극복
특정 상속 체계에 종속되지 않음
프레임워크에 종속적이지 않게 재활용 가능
Advantage
적은 시스템 비용
Reference type cost > Value type cost
용이한 테스트
GUI 코드 없이도 수월한 테스트
Limitation
Limitation
Objective-C Protocol

+ 

Swift Extenstion



Default
Implimentation≠
자주 사용되는 Delegate, DataSource 등
프레임워크 프로토콜에 기본구현 불가
Limitation
extension UITextFieldDelegate {
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.endEditing(true)
return true
}
}
extension UITableViewDelegate {
func tableView(tableView: UITableView, didSelectRowAtIndexPath
indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
}
이것이 안되면 

정녕 무슨 소용이란 말입니까…
OTL
Summary
Summary
Value Type을 사용하여 성능상의 이득을 취하자
Protocol + Extension + Generic은 환상의 조합
이다
이제 상속을 통한 수직 확장이 아닌

Protocol과 Extension을 통한 수평 확장과

기능추가를 고민해 볼 때…
Reference
Protocol-Oriented Programming in Swift
(#WWDC15, 408)
Building Better Apps with Value Types in Swift
(#WWDC15, 414)
Protocol and Value Oriented Programming in
UIKit Apps (#WWDC16, 419)
LET’SWIFT 2016 Session

: 스위프트 퍼포먼스 이해하기 - 유용하 님
Protocol Oriented Programming in Swift
let swift(16)

More Related Content

What's hot (20)

Dependency Injection 소개
Dependency Injection 소개
beom kyun choi
 
Javascript 교육자료 pdf
Javascript 교육자료 pdf
Hyosang Hong
 
일단 시작하는 코틀린
일단 시작하는 코틀린
Park JoongSoo
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)
NAVER D2
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
Yong Joon Moon
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
Yongha Yoo
 
EcmaScript6(2015) Overview
EcmaScript6(2015) Overview
yongwoo Jeon
 
MVP 패턴 소개
MVP 패턴 소개
beom kyun choi
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
NAVER D2
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
NAVER D2
 
안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법
mosaicnet
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
NAVER Engineering
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 
iOS 메모리관리
iOS 메모리관리
Changwon National University
 
Redux
Redux
NAVER Engineering
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
Circulus
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
beom kyun choi
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
Young-Beom Rhee
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GDG Korea
 
Dependency Injection 소개
Dependency Injection 소개
beom kyun choi
 
Javascript 교육자료 pdf
Javascript 교육자료 pdf
Hyosang Hong
 
일단 시작하는 코틀린
일단 시작하는 코틀린
Park JoongSoo
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 
[devil's camp] - 알고리즘 대회와 STL (박인서)
[devil's camp] - 알고리즘 대회와 STL (박인서)
NAVER D2
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
Yong Joon Moon
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
Yongha Yoo
 
EcmaScript6(2015) Overview
EcmaScript6(2015) Overview
yongwoo Jeon
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
NAVER D2
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
NAVER D2
 
안드로이드 설계코드 노하우 및 개발방법
안드로이드 설계코드 노하우 및 개발방법
mosaicnet
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
NAVER Engineering
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
Sung-hoon Ma
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
Circulus
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
beom kyun choi
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
Young-Beom Rhee
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GDG Korea
 

Viewers also liked (7)

Protocol 잘 쓰기 (let us: Go! Summer 2017)
Protocol 잘 쓰기 (let us: Go! Summer 2017)
Mike JS Choi
 
Swift and Xcode8
Swift and Xcode8
Hyuk Hur
 
Swift package manager
Swift package manager
성관 윤
 
Letswift Swift 3.0
Letswift Swift 3.0
Sehyun Park
 
Swift server-side-let swift2016
Swift server-side-let swift2016
Eric Ahn
 
Swift internals
Swift internals
Jung Kim
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
Wanbok Choi
 
Protocol 잘 쓰기 (let us: Go! Summer 2017)
Protocol 잘 쓰기 (let us: Go! Summer 2017)
Mike JS Choi
 
Swift and Xcode8
Swift and Xcode8
Hyuk Hur
 
Swift package manager
Swift package manager
성관 윤
 
Letswift Swift 3.0
Letswift Swift 3.0
Sehyun Park
 
Swift server-side-let swift2016
Swift server-side-let swift2016
Eric Ahn
 
Swift internals
Swift internals
Jung Kim
 
LetSwift RxSwift 시작하기
LetSwift RxSwift 시작하기
Wanbok Choi
 
Ad

Similar to Protocol Oriented Programming in Swift (20)

[부스트캠프 웹・모바일 7기 Tech Talk]오승민_Swift의 Protocol에는 감동이 있다
[부스트캠프 웹・모바일 7기 Tech Talk]오승민_Swift의 Protocol에는 감동이 있다
CONNECT FOUNDATION
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
NAVER D2
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP
Chiwon Song
 
iOS Modular Architecture with Tuist
iOS Modular Architecture with Tuist
정민 안
 
[Osxdev]4.swift
[Osxdev]4.swift
NAVER D2
 
[Swift] Protocol (2/2)
[Swift] Protocol (2/2)
Bill Kim
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍
NAVER D2
 
[LetSwift 2023] 객체지향-함수형 아키텍처 직접 만들기
[LetSwift 2023] 객체지향-함수형 아키텍처 직접 만들기
Moonbeom KWON
 
객체지향 설계
객체지향 설계
준영 조
 
Swift protocols
Swift protocols
wileychoi
 
Swift3 typecasting nested_type
Swift3 typecasting nested_type
Eunjoo Im
 
I os 2
I os 2
Sanghoon Han
 
[Swift] Protocol (1/2)
[Swift] Protocol (1/2)
Bill Kim
 
아이폰 앱 패턴
아이폰 앱 패턴
조 용구
 
10장 아이패드에 대한 고려사항
10장 아이패드에 대한 고려사항
Jihoon Kong
 
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
KTH, 케이티하이텔
 
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
KTH
 
Rx for iOS App. RxMVVM-DataCenter!
Rx for iOS App. RxMVVM-DataCenter!
SUNGCHEOL KIM
 
iOS 앱 개발 강의 자료 #1
iOS 앱 개발 강의 자료 #1
Jeong-Hoon Mo
 
[부스트캠프 웹・모바일 7기 Tech Talk]오승민_Swift의 Protocol에는 감동이 있다
[부스트캠프 웹・모바일 7기 Tech Talk]오승민_Swift의 Protocol에는 감동이 있다
CONNECT FOUNDATION
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
NAVER D2
 
20220716_만들면서 느껴보는 POP
20220716_만들면서 느껴보는 POP
Chiwon Song
 
iOS Modular Architecture with Tuist
iOS Modular Architecture with Tuist
정민 안
 
[Osxdev]4.swift
[Osxdev]4.swift
NAVER D2
 
[Swift] Protocol (2/2)
[Swift] Protocol (2/2)
Bill Kim
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍
NAVER D2
 
[LetSwift 2023] 객체지향-함수형 아키텍처 직접 만들기
[LetSwift 2023] 객체지향-함수형 아키텍처 직접 만들기
Moonbeom KWON
 
객체지향 설계
객체지향 설계
준영 조
 
Swift protocols
Swift protocols
wileychoi
 
Swift3 typecasting nested_type
Swift3 typecasting nested_type
Eunjoo Im
 
[Swift] Protocol (1/2)
[Swift] Protocol (1/2)
Bill Kim
 
아이폰 앱 패턴
아이폰 앱 패턴
조 용구
 
10장 아이패드에 대한 고려사항
10장 아이패드에 대한 고려사항
Jihoon Kong
 
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
H3 2011 ios5 새로운 기능들의 프로젝트 적용 사례_ios팀_김윤봉
KTH, 케이티하이텔
 
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
H3 2011 iOS5 새로운 기능들의 프로젝트 적용 사례
KTH
 
Rx for iOS App. RxMVVM-DataCenter!
Rx for iOS App. RxMVVM-DataCenter!
SUNGCHEOL KIM
 
iOS 앱 개발 강의 자료 #1
iOS 앱 개발 강의 자료 #1
Jeong-Hoon Mo
 
Ad

Protocol Oriented Programming in Swift