[iOS/Swift] 앱 개발의 실무적 접근으로 배울 디자인 패턴 ~Mediator~
13346 단어 iOSSwift신인 프로그래머 응원디자인 패턴
매우 일반적인 iOS 앱 개발의 일반적인 상황
Swift의 핵심 라이브러리 및 프레임 워크에서 사용되는 패턴
주목하여 디자인 패턴을 다시 배워 본 기록입니다.
관련 기사 목록
[iOS/Swift] 앱 개발의 실무적 접근 방식으로 배우는 디자인 패턴
Mediator 패턴 개요
사용소
실용적인 예로는 UIPageViewController 아래에있는 하위 ViewController 간의 알림이 있습니다.
아래 예제 코드는 빨간색 배경의 ViewController가 숨겨질 때 파란색 배경의 ViewController에 알림을 제공하는 예제입니다.
UIPageViewController가 Mediator의 역할을 담당합니다.
이점은 새로운 Receiver가 되는 아이 ViewController가 늘어났을 때, 기존의 아이 ViewController는 변경하지 않아도 된다는 점입니다.
샘플 코드
Xcode 11.3에서 단일 페이지 응용 프로그램을 새로 만들고 ViewController.swift에 다음 코드를 복사하면 작동합니다.
// MARK: - プロトコル
protocol Receiver {
func receive(message: String)
}
protocol Sender {
func send(message: String)
}
protocol Mediator: class {
var recipients: [Receiver] { get }
func send(message: String)
}
// MARK: - PageViewControllerの子ViewController
// 送り手のViewController
final class SenderViewController: UIViewController {
// Message送信をMediatorに委譲する
weak var messageDelegate: Mediator?
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// 表示されなくなった時にMessageを送信(Mediatorに委譲)
messageDelegate?.send(message: "SenderViewController.viewDidDisappear()")
}
}
// 受け手のViewController ※Receiverプロトコルに準拠
final class RecieverViewController: UIViewController, Receiver {
func receive(message: String) {
print("\(message)を受信しました")
}
}
// MARK: - PageViewController
final class ViewController: UIPageViewController {
// 送り手のViewController
let senderViewController = SenderViewController()
// 受け手のViewController
let receiverViewController = RecieverViewController()
// 子ViewController配列
var controllers = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
// PageViewControllerの子ViewControllerを設定
senderViewController.view.backgroundColor = .red
controllers.append(senderViewController)
receiverViewController.view.backgroundColor = .blue
controllers.append(receiverViewController)
setViewControllers([controllers[0]], direction: .forward, animated: false, completion: nil)
dataSource = self
// SenderViewControllerの委譲先に自分を設定する
senderViewController.messageDelegate = self
}
}
// PageViewControllerをMediatorプロトコルに準拠
extension ViewController: Mediator {
var recipients: [Receiver] {
// 子ViewControllerの中でReceiverプロトコルに準拠しているものを返す
return controllers.filter { $0 is Receiver } as! [Receiver]
}
func send(message: String) {
for recipient in recipients {
recipient.receive(message: message)
}
}
}
※설명에는 무관합니다만 움직일 때에 코피페가 필요한 코드
// UIPageViewControllerDataSource
extension ViewController: UIPageViewControllerDataSource {
// 右にスワイプ(戻る)
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard
let index = controllers.firstIndex(of: viewController),
index > 0
else {
return nil
}
return controllers[index - 1]
}
// 左にスワイプ(進む)
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard
let index = controllers.firstIndex(of: viewController),
index < controllers.count - 1
else {
return nil
}
return controllers[index + 1]
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
return controllers.count
}
}
Reference
이 문제에 관하여([iOS/Swift] 앱 개발의 실무적 접근으로 배울 디자인 패턴 ~Mediator~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/y-some/items/c63746780cc56714ff11
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Xcode 11.3에서 단일 페이지 응용 프로그램을 새로 만들고 ViewController.swift에 다음 코드를 복사하면 작동합니다.
// MARK: - プロトコル
protocol Receiver {
func receive(message: String)
}
protocol Sender {
func send(message: String)
}
protocol Mediator: class {
var recipients: [Receiver] { get }
func send(message: String)
}
// MARK: - PageViewControllerの子ViewController
// 送り手のViewController
final class SenderViewController: UIViewController {
// Message送信をMediatorに委譲する
weak var messageDelegate: Mediator?
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// 表示されなくなった時にMessageを送信(Mediatorに委譲)
messageDelegate?.send(message: "SenderViewController.viewDidDisappear()")
}
}
// 受け手のViewController ※Receiverプロトコルに準拠
final class RecieverViewController: UIViewController, Receiver {
func receive(message: String) {
print("\(message)を受信しました")
}
}
// MARK: - PageViewController
final class ViewController: UIPageViewController {
// 送り手のViewController
let senderViewController = SenderViewController()
// 受け手のViewController
let receiverViewController = RecieverViewController()
// 子ViewController配列
var controllers = [UIViewController]()
override func viewDidLoad() {
super.viewDidLoad()
// PageViewControllerの子ViewControllerを設定
senderViewController.view.backgroundColor = .red
controllers.append(senderViewController)
receiverViewController.view.backgroundColor = .blue
controllers.append(receiverViewController)
setViewControllers([controllers[0]], direction: .forward, animated: false, completion: nil)
dataSource = self
// SenderViewControllerの委譲先に自分を設定する
senderViewController.messageDelegate = self
}
}
// PageViewControllerをMediatorプロトコルに準拠
extension ViewController: Mediator {
var recipients: [Receiver] {
// 子ViewControllerの中でReceiverプロトコルに準拠しているものを返す
return controllers.filter { $0 is Receiver } as! [Receiver]
}
func send(message: String) {
for recipient in recipients {
recipient.receive(message: message)
}
}
}
※설명에는 무관합니다만 움직일 때에 코피페가 필요한 코드
// UIPageViewControllerDataSource
extension ViewController: UIPageViewControllerDataSource {
// 右にスワイプ(戻る)
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard
let index = controllers.firstIndex(of: viewController),
index > 0
else {
return nil
}
return controllers[index - 1]
}
// 左にスワイプ(進む)
func pageViewController(_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard
let index = controllers.firstIndex(of: viewController),
index < controllers.count - 1
else {
return nil
}
return controllers[index + 1]
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
return controllers.count
}
}
Reference
이 문제에 관하여([iOS/Swift] 앱 개발의 실무적 접근으로 배울 디자인 패턴 ~Mediator~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/y-some/items/c63746780cc56714ff11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)