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) { } }
結論
您可以將工作委託給其他人/其他事物來完成。委託幫助您分離關注點、解耦類並使程式碼更易於重用。使用委託的最佳起點是在您的檢視和檢視控制器之間。
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP