gpt4 book ai didi

子类和父类(super class)的 Swift 约束协议(protocol)

转载 作者:行者123 更新时间:2023-12-04 10:50:39 24 4
gpt4 key购买 nike

我想为 UIViewCntroller 和 UIView 实现我自己的 HUD,所以我这样做了:

protocol ViewHudProtocol {
func showLoadingView()
func hideLoadingView()
}

extension ViewHudProtocol where Self: UIView {

func showLoadingView() { //Show HUD by adding a custom UIView to self.}
}

func hideLoadingView() {
}
}

现在我可以轻松地在任何 UIView 上采用 ViewHudProtocol 来调用 showLoadingViewhideLoadingView .问题是我想对 UIViewController 使用相同的协议(protocol),所以我这样做了:
extension ViewHudProtocol where Self: UIViewController {

func showLoadingView() {
self.view.showLoadingView() //Error: UIView has no member showLoadingView
}

func hideLoadingView() {
self.view.hideLoadingView() //Error: UIView has no member hideLoadingView
}
}

我同意 UIView 尚未采用协议(protocol)的错误。所以我这样做了:
extension UIView: ViewHudProtocol {}

它有效。有一个更好的方法吗?我的意思是用 ViewHudProtocol 扩展每个 View 感觉不对。 ,并非所有人都会使用它。如果我可以做类似的事情,“如果 UIViewController 需要它,则仅对 UIView 隐式采用 ViewHudProtocol。否则,您可以在需要时在任何 UIView 上手动采用 ViewHUDProtocol。”

最佳答案

我将通过以下方法解决这个问题,使用 associatedtype ,仅为所需的 View 和/或 Controller 定义(在 Xcode 11.2/swift 5.1 中测试):

protocol ViewHudProtocol {
associatedtype Content : ViewHudProtocol

var content: Self.Content { get }

func showLoadingView()
func hideLoadingView()
}

extension ViewHudProtocol where Self: UIView {

var content: some ViewHudProtocol {
return self
}

func showLoadingView() { //Show HUD by adding a custom UIView to self.}
}

func hideLoadingView() {
}
}

extension ViewHudProtocol where Self: UIViewController {

func showLoadingView() {
self.content.showLoadingView() //NO Error
}

func hideLoadingView() {
self.content.hideLoadingView() //NO Error
}
}

//Usage
extension UITableView: ViewHudProtocol { // only for specific view
}

extension UITableViewController: ViewHudProtocol { // only for specific controller
var content: some ViewHudProtocol {
return self.tableView
}
}

关于子类和父类(super class)的 Swift 约束协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59488360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com