ios - 如何在协议扩展中正确使用“自我”以避免必须使用协议存根?
问题描述
目前我们有一个协议和一个协议扩展:
protocol Camera: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func openTheCamera()
}
extension Camera where Self: UIImagePickerController {
func openTheCamera() {
if UIImagePickerController.isSourceTypeAvailable(.camera) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .camera
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true, completion: nil)
}
}
}
由于该函数已经在协议扩展中定义,我尝试直接在符合类中调用它:
class SomeClass: Camera {
override func viewDidLoad() {
super.viewDidLoad()
openTheCamera()
}
}
问题是当我尝试并符合该类时,我得到了错误:
Typ UIViewController 不符合协议 'Camera' 是否要添加协议存根?
问题是 func 已经在扩展中定义了,我不想再次将它添加到控制器中。如果我添加协议存根 (openTheCamera(){ }) 并在控制器中留空,那么我在协议扩展中定义的函数不会被执行。
解决方案
协议条件错误。你应该使用:
extension Camera where Self: UIViewController {
推荐阅读
- amazon-web-services - S3 生命周期配置与使用 PowerShell 的过滤器
- shell - Jenkins shell 中的多个变量
- meteor - Meteor:可以按 _id 过滤集合,但我不能使用其他字段过滤集合
- c# - 在 C# 中访问对象的“名称”属性
- tensorflow - Mlflow:使用 Tensorflow train_and_evaluate 在评估阶段记录步骤
- regex - 如何在 Go 中使用/访问捕获组?
- apache-spark - PySpark 无法通过 sparkContext/hiveContext 读取 Hive ORC 事务表?我们可以使用 Pyspark 更新/删除配置单元表数据吗?
- python - 距离矩阵 - ValueError:数组太大
- java - Spring Data JPA - 为三个表创建 @Composite 键
- python - 如何生成大小为 41003 的 0 和 1 的数组,并且 1 的数量应该只有 100?