gpt4 book ai didi

实现另一个具有共享关联类型的协议(protocol)的 Swift 协议(protocol)扩展

转载 作者:搜寻专家 更新时间:2023-10-30 22:17:44 24 4
gpt4 key购买 nike

考虑以下几点:

protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
func hi() -> A
}
extension FooBar {
func hello() -> A {
return hi()
}
}

class FooBarClass: FooBar {
typealias A = String
func hi() -> String {
return "hello world"
}
}

此代码编译。但是,如果我注释掉关联类型 typealias A = String 的显式定义,那么出于某种原因,swiftc 无法推断类型。

我感觉这与共享相同关联类型但没有直接断言的两个协议(protocol)有关,例如,类型参数化(可能关联类型不够强大/不够成熟?) ,这使得类型推断不明确。

我不确定这是语言的错误/不成熟,还是我遗漏了协议(protocol)扩展中的一些细微差别,这理所当然地导致了这种行为。

有人可以阐明这一点吗?

最佳答案

看这个例子

protocol Foo {
typealias A
func hello() -> A
}
protocol FooBar: Foo {
typealias B
func hi() -> B
}
extension FooBar {
func hello() -> B {
return hi()
}
}

class FooBarClass: FooBar {
//typealias A = String
func hi() -> String {
return "hello world"
}
}

使用泛型

class FooBarClass<T>: FooBar {
var t: T?
func hi() -> T? {
return t
}
}

let fbc: FooBarClass<Int> = FooBarClass()
fbc.t = 10
fbc.hello() // 10
fbc.hi() // 10

关于实现另一个具有共享关联类型的协议(protocol)的 Swift 协议(protocol)扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33968066/

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