iOS 캠프 TIL - 2020.11.26 목

Updated:

Singleton, Delegation 디자인 패턴

  • Delegation, Delegate 구분 되는 것인가?
    • Delegation 패턴에서 위임받는 것을 Delegate라고 칭한다

Singleton 디자인 패턴

  • 타입을 인스턴스화 하는 과정을 디자인한 패턴
  • 타입의 인스턴스가 단 하나만 생성되도록 디자인한 패턴
  • 코코아 터치 프레임워크의 싱글턴들
    • FileManager.default
    • NotificationCenter.default
  • 싱글턴의 이름으로 shared는 현업에서 잘사용하지않음 (보안 관련)
// 다른 인스턴스도 만들 수는 있는 변형된 싱글턴
struct Sun {
    // type property
    static let shared: Sun = Sun()
}

// 하나의 인스턴스
let sunA = Sun.shared
let sunB = Sun.shared
let sunC = Sun.shared

// 각기 다른 인스턴스
let sun1 = Sun()
let sun2 = Sun()
let sun3 = Sun()
// 하나의 인스턴스만 강제하는 싱글턴
struct Sun {
    // type property
    static let shared: Sun = Sun()

    private init() {
    }
}

// 하나의 인스턴스
// 하지만 struct는 값타임이므로 값만 복사될 뿐이다
// 이후 A, B, C 프로퍼티에 다른 값을 넣으면 각각 달라진다
let sunA = Sun.shared
let sunB = Sun.shared
let sunC = Sun.shared

// 각기 다른 인스턴스 생성 불가
//let sun1 = Sun()
//let sun2 = Sun()
//let sun3 = Sun()
// 싱글턴은 클래스로 만들자
class Sun {
    // type property
    static let shared: Sun = Sun()
    private init() {
    }
}

Protocol

  • 기능의 요구사항 (자바의 interface 개념과 비슷), 청사진
  • 프로토콜을 이름을 지을 때는 보통 “~을 할 수 있다” 느낌으로 짓는다.
  • 기능 구현을 직접 하지는 않고 어떤 기능이 필요한지 알려 준다.
  • 프로토콜의 모든 요소를 구현해야 되는 것은 아니다.optional 키워드가 붙은 것은 구현하지 않아도 된다.
    • swift자체에서는 optional 사용을 못하므로 사용하려면 @objc를 붙여줘야 한다.
protocol Flyable {
    var name: String { get }
    var wings: Int { get set }
    func fly()
}

protocol Walkable {
    func walk()
}

struct Duck: Flyabl, Walkable {
    var name: String = "오리"
    var wings: Int = 2
    func fly() {
        print("푸드득")
    }
    func walk() {
        print("뒤뚱뒤뚱")
    }
}

struct Chicken: Flyable {
    var name: String { 
        return "치킨" 
    }
    var wings: Int = 4
    flry() {
        print("꼬꼬댁")
    }
}
protocol Makealbe {
    func makeSomething(withRecipe: String)
}

class JuiceMaker: Makeable {
    func makeSomething(withRecipe recipe: String) {
        print(recipe + "를 가지고 쥬스를 만든다")
    }
}

class CoffeeMaker: Makeable {
    func makeSomething(withRecipe recipe: String) {
        print(recipe + "를 가지고 커피를 만든다")
    }
}

class Shop {
    // Makeable 프로토콜을 준수한 어떤 타입도 가능하다
    var maker: Makeable

    intit(maker: Makeable) {
        self.maker = maker
    }
}

let juiceShop = Shop(maker: JuiceMaer())
juiceShop.maker.makeSomething(withRecipe: "오렌지 2개")

// 겨울되서 쥬스말고 다른것을 팔고자하면?
let coffeeShop = Shop(maker: CoffeeMaker())
coffeeShop.maker.makeSomething(withRecipe: "커피 1스푼")

타입간의 결합도를 낮춘다

Delegation 디자인 패턴

  • 프로토콜을 응용한 디자인 패턴
// CEODelegate로 이름지을 수 있다
protocol CEODelegate {
    func manageSchedule()
    func makeDocuments()
    func sayHello()
    func drive()
    var typingSpeed: Int { get }
    var grade: String { get }
}

struct 비서왕: CEODelegate {
    func manageSchedule() {
        print{"척척 스케쥴링"}
    }
    func makeDocuments() {
        print("척척 문서링")
    }
    func sayHello() {
        print("아침 문안인사 드립니다")
    }
    func drive() {
        print("레이싱 부웅~~")
    }
    var typingSpeed: Int = 700
    var grade: String = "A+"
}

struct 초보비서: CEODelegate {
    func manageSchedule() {
        print{"자꾸 빼먹네 스케쥴링"}
    }
    func makeDocuments() {
        print("허둥지둥 문서링")
    }
    func sayHello() {
        print("하이")
    }
    func drive() {
        print("가긴 합니다")
    }
    var typingSpeed: Int = 200
    var grade: String = "C-"
}

struct CEO {
    var delegate: CEODelegate?
}

var jinie: CEO = CEO()
var yagom: 초보비서 = 초보비서()
jinie.delegate = yagom
jinie.delegate?.drive()

// 운전을 너무 못해서 비서를 바꾼다
let 이승기 = 비서왕()
jinie.delegate = 이승기
jinie.delegate?.drive()

CEO의 비서는 Helpale 프로토콜만 충족하면 누구든 채용될 수 있다.

Leave a comment