【发布时间】:2021-12-16 01:31:15
【问题描述】:
当我向具有关联类型的协议添加约束扩展时,swift 编译器会忽略我的约束。
当我写作时:
protocol Arr {
associatedtype Element
func node(_ at: Int) -> Element?
}
extension Arr where Element == String {
func node(_ at: Int) -> String? {
nil
}
}
struct Doo: Arr {
}
Xcode 构建成功,它认为我的Doo 的Element 是String。它忽略了where Element == String 约束。
当我写作时:
protocol Arr {
associatedtype Element
func node(_ at: Int) -> Element?
}
extension Arr where Element == String {
func node(_ at: Int) -> Element? { // use Element
nil
}
}
struct Doo: Arr {
}
Xcode 按预期显示错误。
这是 Xcode 错误还是 Swift 功能?
Xcode 版本:Version 13.1 (13A1030d)
Swift 版本:
swift-driver version: 1.26.9 Apple Swift version 5.5.1 (swiftlang-1300.0.31.4 clang-1300.0.29.6)
Target: arm64-apple-macosx12.0
【问题讨论】:
-
我认为这是因为约束是在很久以后才应用的(尽管我没有任何来源)。
Doo得到了node方法“只要”你说: Arr。然后它看到node返回String?,所以它推断Element必须是String。如果node返回Element?,则无法进行推理。你知道 Swift 从方法签名中推断出关联的类型吗? -
只有在您尝试调用
node时才会检查约束。只有这样编译器才会说“node仅在...时可用” -
The Xcode show an error for me expected- 您期望的错误是什么? -
@Cristik Xcode 显示:
Type 'Doo' does not conform to protocol 'Arr'
标签: swift protocols associated-types