我正在创建一个 Swift 项目,我想定义一个特定的协议来强制其他组件实现一个animate
方法:
protocol AnimatableBehavior {
@IBAction func animate()
}
问题是我希望这个方法是一个IBAction
,但是我从 XCode 得到这个错误:
只有实例方法可以声明为“IBAction”
我的问题是,你将如何实施这样的事情?
我考虑过:
- Remove
@IBAction
,但是我需要记住在每个实现的类中添加它。不是很优雅且容易出错。 - 创建一个基类而不是协议,但随后我强制所有组件对我的基类进行子类化,而不是他们自己选择的子类,因此它不是一个有效的选项。
还有其他想法吗?
编辑:回复下面的评论。
on 协议的想法IBAction
是因为在项目中会有很多不同的开发者实现小的 UI 组件,所有这些组件都有 animate 方法。这些组件可以通过编程方式或通过 Interface Builder 添加,它们总是非常方便,IBAction
因为我计划从 IB 文件中组合它们以最大限度地简化视图控制器(这显然是一个仅视图任务)。
因此,下面提出的在控制器中添加一个仅调用animate
组件的方法的解决方案并不好,因为它是冗余代码并且使您的控制器更加依赖您的视图。
让开发人员记住IBAction
在方法上添加关键字的想法是可行的,但正如我所说的那样容易出错(我的意思是会有一些人忘记它),我想确保这是始终可从 IB 访问。它还增加了额外的认知负担,因为我需要IBAction
在协议中记录这种缺失并要求实现者手动添加它。
我知道这不是在 iOS 和 中工作的常见方式UIKit
,但这就是我发布问题的原因,也许有人有其他想法。