gpt4 book ai didi

swift - 方法 ... 在非最终类中 ... 不能在协议(protocol)扩展中实现,因为它返回 'Self' 并具有关联的类型要求

转载 作者:行者123 更新时间:2023-12-05 07:18:06 27 4
gpt4 key购买 nike

这是我的代码:

protocol Person {
associatedtype Homework

static func generate(homeWork: Homework) -> Self
}

extension Person {
static func generate(homeWork: Homework) -> Self {
fatalError()
}
}

// Method 'generate(homeWork:)' in non-final class 'Teacher'
// cannot be implemented in a protocol extension because it
// returns 'Self' and has associated type requirements
class Teacher: Person {
typealias Homework = Int
}

尽管类型的命名很奇怪,但我很好奇为什么不能使非最终类符合具有返回 Self 的方法并具有 associatedtype 的协议(protocol) 作为参数类型。

注意:我不是在问如何解决这个问题(因为我可以标记我的class final)。我想知道为什么这是不可能的。

我觉得很奇怪。带有 associatedtypesSelf 的协议(protocol)当然总是很困难,但是当使用两者之一时(返回 Self/associatedtype参数中的协议(protocol)类型)编译代码就好了。

为什么我不能遵守具有方法默认实现的协议(protocol),而该方法的返回类型为 Selfassociatedtype参数,但是当只使用其中一个代码编译时?为什么在处理继承性时两者都是问题(因为将 class 标记为 final 修复了错误消息,所以它必须是具有继承性的东西)?

最佳答案

看起来是因为编译器的限制。以下是 Swift 团队成员的一些相关讨论: https://twitter.com/_danielhall/status/737782965116141568

原始推文显示了如果我们尝试从 Teacher 创建子类会发生什么,编译器将无法将其识别为符合 Person 协议(protocol)。

与该线程中的 swift 团队特别相关:“我们在匹配协议(protocol)要求时不支持子类型化。我认为这是该语言中缺少的功能”

因此知道编译器在这些情况下无法将子类识别为符合协议(protocol),因此他们决定强制使用最终类。

关于swift - 方法 ... 在非最终类中 ... 不能在协议(protocol)扩展中实现,因为它返回 'Self' 并具有关联的类型要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58492861/

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