我如何知道如何遵守 Swift 中的特定协议?

Posted

技术标签:

【中文标题】我如何知道如何遵守 Swift 中的特定协议?【英文标题】:How do I know how to conform to a specific protocol in Swift? 【发布时间】:2015-12-01 08:10:15 【问题描述】:

当我声明一个我想遵守协议的类时,Swift 会向我显示一条消息,指出在满足协议的所有要求之前我不遵守该协议。

有没有办法让编译器向我提供更具体的详细信息,说明我缺少哪些要求或我为什么不符合该协议,或者我是否总是必须使用我的班级打开该协议的源代码源代码并排,做个人工眼球对比?

为了澄清,我并不是特别询问任何特定的协议,事实上我真的在寻找更好的支持来执行我自己的协议。

【问题讨论】:

你来自Ruby? ) 在 Swift 中你应该实现 all 协议方法和属性,这与 Objective-C 不同。您可以从协议声明中复制它们:) 或许可以制作一个运行脚本阶段来满足你的需要,但我不擅长脚本。 @kelin:这并不完全正确,协议方法可以有默认实现。有关示例,请参见 ***.com/questions/32668635/…:您不必为了符合该协议而实现 struct CollectionType 中列出的 所有 方法。 【参考方案1】:

Issue Navigator(左侧面板上的感叹号图标,或CMD+4)将显示哪些协议不符合以及原因:

【讨论】:

【参考方案2】:

有没有办法让编译器向我提供有关我缺少哪些要求的更具体的详细信息?

是的,完整的编译器输出会准确地告诉您缺少哪些要求:

转到“报告导航器”,cmd 8。 选择最后一个构建。 对于每个已编译的文件,右侧都有一个打开的图标 编译器的完整文本输出。

简单示例:

class A : Equatable 

编译器输出:

错误:类型“A”不符合协议“Equatable” A类:平等 ^ Swift.Equatable:28:17:注意:协议需要函数 '==' 类型为 '(A, A) -> Bool' public func ==(lhs: Self, rhs: Self) -> Bool

【讨论】:

我认为Issue Navigator中列出的错误也有一个“披露”三角形,你可以点击它来揭示细节(在这种情况下,哪些方法没有实现)。 这个答案也很有帮助,但我将使用 Issue Navigator 解决方案作为接受的答案,因为它稍微方便一些。编辑:我也对此进行了测试,发现它也非常适合检查历史问题。即,您可以检查过去失败的构建并查看原因的详细信息。非常好。【参考方案3】:

Xcode 9,帮助实现 Swift Datasource & Delegates 的所有强制方法。

这里是UITableViewDataSource的例子:

显示警告/提示以实现强制方法:

点击“修复”按钮,它将在代码中添加所有强制方法:

【讨论】:

以上是关于我如何知道如何遵守 Swift 中的特定协议?的主要内容,如果未能解决你的问题,请参考以下文章

Swift如何兼顾协议中默认和自定义方法的调用?

swift-如何确保最初在哪个协议或类型中定义了特定属性?

Swift中的协议

swift中的protocol和OC中protocol的区别

iOS开发-Swift进阶之协议Protocol!

swift 3.0Type 'Any?' has no subscript members