[SWIFT] 프로토콜과 옵저버패턴

힐링힐링·2023년 9월 3일
0

SWIFT 문법

목록 보기
2/26

techit 과제중 고오급~ 문제가 나왔다.
Protocol과 Obsever패턴을 이용하여 문제를 푸는것이다.
난 참고로 Protocol과 Observer패턴을 모르는 상태다.
근데 같이 나오다니 .. 두뇌풀가동...

프로토콜(Protocol) 이란?

특정 역할을 하기 위한 메소드, 프로퍼티, 기타 요구사항 등의 청사진

프로토콜의 사용

구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있다.

프로토콜은 정의를 하고 제시를 할 뿐 스스로 기능을 구현하지는 않는다. (조건만 정의)

하나의 타입으로 사용되기 때문에 아래와 같이 타입 사용이 허용되는 모든 곳에 프로토콜을 사용할 수 있다.

기본형태

protocol 프로토콜이름 {
 // 프로토콜 정의
}

Property Requirments

이름과 타입, gettable, settable명시
함수의 경우 이름과 프로퍼티 명시

protocol Publisher {
    var observers: [Observer] { get set }
    func subscribe(observer: Observer)
    func unSubscribe(observer: Observer)
    func notify(message: String)
}

protocol Observer {
    var id: String { get set }
    func update(message: String)
}

프로토콜 관련 클래스 정의

Publisher를 프로토콜의 클래스인 XStore를 생성


class XStore : Publisher {
    var observers : [Observer]

    // 초기화
    init(observers: [Observer]) {
        self.observers = observers
    }
    
    // 구독
    func subscribe(observer: Observer) {
        self.observers.append(observer)
    }
    
    //구독해제
    
    func unSubscribe(observer: Observer) {
        if let idx = self.observers.firstIndex(where: { $0.id == observer.id}) {
            self.observers.remove(at: idx)
        }
    }
    
    // 알림
    func notify(message: String) {
        for observer in observers {
            observer.update(message: message)
        }
    }
}

Observer를 프로토콜의 클래스인 Customer를 생성

// 고객 Customer 클래스 정의
class Customer: Observer{
    var id : String
    
    //초기화
    init(id: String){
        self.id = id
    }
    
    // 알림
    func update(message: String) {
        print("\(id)\(message)")
    }
    
}

실행결과

let xStore = XStore(observers: [])
let cheolsu = Customer(id: "철수")
let younghee = Customer(id: "영희")
let mina = Customer(id: "미나")
let minsu = Customer(id: "민수")

// 구독
xStore.subscribe(observer: cheolsu)
xStore.subscribe(observer: younghee)
xStore.subscribe(observer: minsu)
xStore.notify(message: "iPhone 15 출시!")

// 구독취소
xStore.unSubscribe(observer: younghee)
xStore.notify(message: "iPad Pro 입고!")

철수님 iPhone 15 출시!
영희님 iPhone 15 출시!
민수님 iPhone 15 출시!
철수님 iPad Pro 입고!
민수님 iPad Pro 입고!

profile
블로그 이전합니다 https://james-kim-tech.tistory.com/

0개의 댓글