gpt4 book ai didi

ios - 无法传递对指定了 self 的协议(protocol)的引用

转载 作者:搜寻专家 更新时间:2023-11-01 06:51:00 29 4
gpt4 key购买 nike

我有一个项目使用 NVActivityIndicatorView库,我正在尝试从两个 View Controller 中提取一些逻辑。两个 View Controller 都符合 NVActivityIndi​​catorViewable 的定义:

// From the libaray. I don't want to modify this.
public protocol NVActivityIndicatorViewable {}

public extension NVActivityIndicatorViewable where Self: UIViewController
{
func startAnimating( ... ) { ... }
func stopAnimating() { ... }
}

因此,我希望能够传递其中一个 View Controller 并在其上使用 startAnimationstopAnimation 方法。

func sharedLogic(sender: NVActivityIndicatorViewable)
{
sender.startAnimating( ... )
sender.stopAnimating()
}

但是,这会因编译器错误而失败 'NVActivityIndi​​catorViewable' requires that 'NVActivityIndi​​catorViewable' inherit from 'UIViewController'

sender: UIViewController 尝试这个,这失败并出现编译时错误 Value of 'UIViewController' has no member 'startAnimating' 正如我所料。

func sharedLogic(sender: UIViewController) 
{
sender.startAnimating( ... )
sender.stopAnimating()
}

我找到了两个可能的解决方案:

  1. 创建一个指定这两种类型的空子类:(这个新类型不包含任何逻辑)
class ActivityIndicatorViewController: UIViewController, NVActivityIndicatorViewable { }
  1. 使用扩展来指定所有 View Controller 都可以是事件指示器:(这会导致许多类出现冗余一致性错误)
extension UIViewController: NVActivityIndicatorViewable { }

我可以在不创建新类型的情况下完成这个吗?

环境设置:

  • Xcode 版本:10.1
  • iOS 部署目标:9.0
  • Swift 版本:3

最佳答案

这里你想要的是一个composition type - 一种既继承自 UIViewController 又符合 NVActivityIndi​​catorViewable 的类型:

UIViewController & NVActivityIndicatorViewable

您可以直接将其用作方法的参数类型:

func sharedLogic(sender: UIViewController & NVActivityIndicatorViewable)

或者你可以为它创建一个typealias(虽然我想不出一个更短的名字):

typealias SomeShorterName = UIViewController & NVActivityIndicatorViewable

然后你可以使用SomeShorterName作为参数类型。

关于ios - 无法传递对指定了 self 的协议(protocol)的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57045521/

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