## CoordinatorPhoneCallerProtocol 協議 ```swift= extension CoordinatorPhoneCallerProtocol { func displayPhoneNumberCall(by number: String) { URLUtils.openPhone(number: number) } ``` ## 需要使用該功能的 Coordinator 的類別再去遵循該特性。 ```swift= class DeviceEnrollmentCoordinator: SFBaseCoordinator, CoordinatorPhoneCallerProtocol { ``` # 首先,URLUtils 這一個struct 有一個靜態函示,他呼叫了 UIApplication 的單例。並且執行了 open 方法。該方法用於在設備上打開其他應用程序、打開瀏覽器並加載指定 URL、打開電子郵件、打開文件等操作。它接受一個 URL 對像作為參數,並嘗試將其打開在設備上。如果設備上存在多個應用程序可以處理此 URL,系統會詢問用戶要使用哪個應用程序打開該 URL。 ```swift // // URLUtils.swift // Core // // Created by Chris on 2022/9/2. // Copyright © 2022 Stellantis. All rights reserved. // import Foundation import UIKit public struct URLUtils { public static func openPhone(number: String?){ guard let n = number, let nUrl = URL(string: "tel://" + n) else { return } UIApplication.shared.open(nUrl) } } ``` ### 執行 ```swift= URLUtils.openPhone(number: number) ``` # 執行這個方法,應當是誰的職責? ## 問題1 呼叫的是靜態函示,是不是應該要放在 UseCase? 在軟體開發過程中,Use Case 通常是描述系統或應用程式中的某些功能或需求。相對而言,靜態函式則是用來實現這些功能或需求的方法之一。因此,靜態函式可以在多個 Use Case 中使用,而不是屬於某個特定的 Use Case。 ## 問題2 URLUtils.openPhone(number: number) 執行這個方法,應當是誰的職責?Use Case 還是 Coordinator? ### Use Case 或是 Coordinator 都是可以的 Use Case 負責描述系統或應用程式中的某些功能或需求,而 Coordinator 負責協調與管理這些 Use Case。因此,根據這些架構,URLUtils.openPhone(number: number) 方法的職責可能屬於 Use Case 或 Coordinator。 ### 如果在某個畫面中顯示電話號碼,應當用 UseCase 如果這個方法被用來實現某個特定 Use Case 中的功能,例如在某個畫面中顯示電話號碼,並且這個功能是這個 Use Case 中的一部分,那麼這個方法的職責應該屬於這個 Use Case。 ### 如果這個方法被多個 UseCase 共享,應該用 Coordinator 如果這個方法被多個 Use Case 共享,或者被用來實現某個跨 Use Case 的功能,例如在應用程式中打電話的功能,那麼這個方法的職責應該屬於某個 Coordinator。 ## 問題3 UIApplication.shared.open 應該放在 UseCase 還是 Coordinator? 在 iOS 架構中,使用 UIApplication.shared.open 方法來打開 URL 通常是由 Use Case 負責的,因為這是應用程序中的一個具體功能,例如在應用程序中顯示一個 Web 頁面或打開外部應用程序。 URLUtils.openPhone(number: number) 方法的職責應該視具體情況而定,如果它屬於某個特定 Use Case 的一部分,那麼它的職責應該屬於這個 Use Case;如果它是被多個 Use Case 共享的,或者被用來實現某個跨 Use Case 的功能,那麼它的職責應該屬於某個 Coordinator。 ## 我們應該怎麼做 在 Clean Architecture 中,UIApplication.shared.open 方法應當是由 Presenter 或者 View 負責執行,而不是 Use Case 或 Coordinator。 Presenter 是用於從 Use Case 中取回數據並準備呈現給 View 顯示的中間層。因此,如果 View 需要打開一個 URL,則應該由 Presenter 負責執行這個任務。這種情況下,Presenter 將 URL 作為一個參數傳遞給 View,由 View 負責執行 UIApplication.shared.open 方法。 同樣地,如果 View 直接處理用戶輸入事件並需要打開一個 URL,則 View 應該直接執行 UIApplication.shared.open 方法。 Coordinator 的職責是管理 View Controller,並確保它們以正確的方式顯示在屏幕上。打開 URL 並不涉及 View Controller 的顯示,因此它不是 Coordinator 的職責。 總之,在 Clean Architecture 中,UIApplication.shared.open 方法應該是由 Presenter 或者 View 負責執行。這種方法應該盡可能地與其他架構層分離,以確保架構的清晰和可測試性。 ## 結論 ### UIApplication.shared.open 在廣義架構上要放在UseCase 因為這是應用程序中的一個具體功能,例如在應用程序中顯示一個 Web 頁面或打開外部應用程序。 ### URLUtils.openPhone(number: number),Use Case 或是 Coordinator 都是可以的 URLUtils.openPhone(number: number) 方法的職責應該視具體情況而定,如果它屬於某個特定 Use Case 的一部分,那麼它的職責應該屬於這個 Use Case;如果它是被多個 Use Case 共享的,或者被用來實現某個跨 Use Case 的功能,那麼它的職責應該屬於某個 Coordinator。 ### 在 Clean Architecture 應該放在Presenter 或 View Coordinator 的職責是管理 View Controller,並確保它們以正確的方式顯示在屏幕上。打開 URL 並不涉及 View Controller 的顯示,因此它不是 Coordinator 的職責。