Idea from…
상속의 한계
서로다른 클래스에서 상속받은 클래스는 동일한 기능
을
구현하기 위해 중복코드 발생
카테고리의 한계 및 부작용
프로퍼티 추가 불가
오직 클래스에만 적용 가능
기존 메서드를 (자신도 모르게) 오버라이드 가능
Protocol
Default Implimentation
POP & Valuein Project
Social Networking Service
Social Media
20.
타임라인을 나타낼 수있는 테이블 뷰 컨트롤러를 구성해 봅니다
“테이블 뷰 형식의 타임라인이 필요해요”
23.
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
}
24.
“성규씨, 정말 간단한기능이 더 필요해요”
사진첩 처럼 볼 수 있는 모드를 추가할 수 있을까요?
25.
“성규씨, 정말 간단한기능이 더 필요해요”
사진첩 처럼 볼 수 있는 모드를 추가할 수 있을까요?
……………………
Content Model
class Content{
var URLString: String
var note: String
}
struct Content {
var URLString: String
var note: String
}
31.
Model Property
class TimelineTableViewController:UITableViewController {
var contents: [Content]
// …
}
class TimelineCollectionViewController: UITableViewController {
var contents: [Content]
// …
}
32.
Model Property
class TimelineTableViewController:UITableViewController,
ContainContents {
var contents: [Content]
// …
}
class TimelineCollectionViewController: UITableViewController ,
ContainContents {
var contents: [Content]
// …
}
protocol ContainContents {
var contents: [Content] { get }
}
33.
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
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...
}
}
37.
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()
}
}
}
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...
}
}
49.
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 { }
50.
Protocol / Model
protocolMediaContainer: 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
}
51.
Protocol / Model
protocolMediaContainer: 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
}
52.
Protocol / Model
protocolMediaContainer: 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
}
Summary
Value Type을 사용하여성능상의 이득을 취하자
Protocol + Extension + Generic은 환상의 조합
이다
이제 상속을 통한 수직 확장이 아닌
Protocol과 Extension을 통한 수평 확장과
기능추가를 고민해 볼 때…
64.
Reference
Protocol-Oriented Programming inSwift
(#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
: 스위프트 퍼포먼스 이해하기 - 유용하 님