gpt4 book ai didi

swift - 当某些协议(protocol)函数更改其签名时,我可以强制编译器失败吗?

转载 作者:搜寻专家 更新时间:2023-10-31 21:58:58 25 4
gpt4 key购买 nike

有没有办法将某些 Swift 函数标记为实现某些协议(protocol)函数,这样如果协议(protocol)的签名发生变化,编译器就可以将实现标记为错误。

例如,考虑这个例子,我有一个 UIViewController 实例的 Foo 协议(protocol)的默认实现,我想为自定义 Bar 覆盖它 类是 UIViewController 的子类。

// V1
protocol Foo {
func number() -> Int
}

extension Foo where Self: UIViewController {
func number() -> Int {
return 0
}
}

// Overrides the default implementation
extension Bar: Foo {
func number() -> Int {
return 1
}
}

现在,协议(protocol)演变为:

// V2
protocol Foo {
func numberV2() -> Int
}

extension Foo where Self: UIViewController {
func numberV2() -> Int {
return 0
}
}

// I think I override the default implementation but not anymore.
// => error prone, no error from the compiler
extension Bar: Foo {
func number() -> Int {
return 1
}
}

如何帮助我的 Bar 扩展意识到 number 函数不再与 Foo 协议(protocol)相关?

最佳答案

不,目前(Swift 4.0)没有办法从编译器那里获得帮助来捕捉这些“有惊无险”。不过,该主题已在 swift-evolution 邮件列表中多次出现,因此人们肯定知道这是一个应该解决的问题。

事实上,Doug Gregor 最近made a change到 Swift 编译器,它将能够捕捉到一些“有惊无险”。此更改不属于当前 Swift 版本的一部分,但会出现在 Swift 4.1 中。

来自 the mailing list post引入变化:

A “near-miss” warning fires when there is a protocol conformance for which:

1) One of the requirements is satisfied by a “default” definition (e.g., one from a protocol extension), and

2) There is a member of the same nominal type declaration (or extension declaration) that declared the conformance that has the same name as the requirement and isn’t satisfying another requirement.

These are heuristics, of course, and we can tune the heuristics over time.

如果我理解正确,当前的启发式方法将无法捕捉到您的确切问题,因为它们只匹配名称完全相同(但类型不同)的方法,但正如 Doug 所说,启发式方法可能会在未来得到改进。

关于swift - 当某些协议(protocol)函数更改其签名时,我可以强制编译器失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47520713/

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