Swift中的委託是什麼?


在本文中,您將學習什麼是委託以及它是如何工作的。

什麼是委託?

顧名思義,委託將控制權賦予其他物件。為了實現這一點,必須將委託物件分配給控制其他物件。

在iOS應用程式中,UIApplicaitonDelegate就是一個例子。UIApplicationDelegate允許您修改iOS行為,例如接收推送通知、開啟URL和啟動應用程式。

委託模式確保需要委託的功能得到提供。

委託模式使物件能夠與其所有者進行通訊,而無需與其程式碼耦合。如果一個物件不必知道其所有者的具體型別,則程式碼更容易重用和維護。

Swift中的協議是什麼?

協議充當一種工具,可以將屬性和方法組合成一個單一實體,以便其他物件可以符合此協議來委託任務。

我們可以實現協議的屬性和函式,這些屬性和函式可以由Swift中的類、結構體或列舉提供。如果這些型別中的任何一個滿足其要求,則稱其符合協議。

建立協議的語法

語法

protocol <protocol_name> {
   // define the required methods here
}

如上所示,我們為協議指定了一個協議名稱,該名稱使用Swift中的protocol關鍵字指定。透過根據協議的要求定義方法,您可以定義協議的目的。

建立委託物件

讓我們嘗試瞭解如何在ImageDownloader類中使用委託。我保留對委託物件(ImageDownloader型別)的一個可選引用,以允許ImageDownloader類例項在沒有委託的情況下執行。如果委託成員變數為nil,ImageDownloader仍然下載檔案,並仍然呼叫它自己的didDownloadImage()方法。

import UIKit class ImageDownloader { var urlString: String var downloadedImage: UIImage? var delegate: ImageDownloaderDelegate? init(_ urlString: String) { self.urlString = urlString } func downloadImage() // downloading image DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { let imageURL = URL(string: self.urlString) let imageData = NSData(contentsOf: imageURL!) self.downloadedImage = UIImage(data: imageData! as Data) // update UI action on main thread DispatchQueue.main.async { self.didDownloadImage() } } } func didDownloadImage() { delegate?.didFinishDownloading(self) } }

建立協議

使用ImageDownloader類,我們將定義一個協議,以便在任務完成或失敗時通知符合條件的物件。此協議將有一組規則(或函式)。

類、結構體或列舉可以符合協議並完成這些函式的實現。

在這個例子中,我們將使ProfileController類符合ImageDownloaderDelegate協議。現在,我們需要將委託物件設定為ProfileController的物件。

確保在ProfileController類中實現了所需的功能。否則,編譯器將報告錯誤。

import UIKit // Protocol Creation protocol ImageDownloaderDelegate { // notify when downloading will be finished func didFinishDownloading(_ sender: ImageDownloader) // notify when downloading will be failed func didFailedDownloading(_ sender: ImageDownloader) }

符合此委託

現在,ProfileController類符合ImageDownloaderDelegate協議。

class ProfileController: UIViewController, ImageDownloaderDelegate { private var imageDownloader: ImageDownloader? private let profileImageView = UIImageView() override func viewDidLoad() { super.viewDidLoad() view.addSubview(profileImageView) // set profileImageView frame here as per requirement downloadImage() } private func downloadImage() { let imageURL: String = "<https://image_url_here>.com" imageDownloader = ImageDownloader(imageURL) imageDownloader?.delegate = self imageDownloader?.downloadImage() } func didFinishDownloading(_ sender: ImageDownloader) { profileImageView.image = sender.downloadedImage let urlString = sender.urlString print(urlString) } func didFailedDownloading(_ sender: ImageDownloader) { profileImageView.image = nil } }

如何建立可選協議方法?

您可以在協議中包含可選方法。您必須為可選協議方法建立一個擴充套件。

// protocol creation protocol ImageDownloaderDelegate { // notify when downloading will be finish func didFinishDownloading(_ sender: ImageDownloader) // notify when downloading will be failed func didFailedDownloading(_ sender: ImageDownloader) } extension ImageDownloaderDelegate { func didFailedDownloading(_ sender: ImageDownloader) { } }

結論

您可以將工作委託給其他人/其他事物來完成。委託幫助您分離關注點、解耦類並使程式碼更易於重用。使用委託的最佳起點是在您的檢視和檢視控制器之間。

更新於:2022年12月21日

4K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.