Swift协议通用函数返回类型
我想使用通用协议类型作为函数返回类型,如下所示:Swift协议通用函数返回类型,swift,generics,Swift,Generics,我想使用通用协议类型作为函数返回类型,如下所示: protocol P { associatedtype T func get() -> T? func set(v: T) } class C<T>: P { private var v: T? func get() -> T? { return v } func set(v: T) { self.v = v } } class Factory { func crea
protocol P {
associatedtype T
func get() -> T?
func set(v: T)
}
class C<T>: P {
private var v: T?
func get() -> T? {
return v
}
func set(v: T) {
self.v = v
}
}
class Factory {
func createC<T>() -> P<T> {
return C<T>()
}
}
协议P{
关联T型
func get()->T?
func集(v:T)
}
丙级:P{
私人变量v:T?
func get()->T{
返回v
}
func集(v:T){
自我评价,自我评价
}
}
阶级工厂{
func createC()->P{
返回C()
}
}
但这段代码编译时出现错误:
有没有办法用Swift实现类似的功能?问题是您不能使用语法
p
P
是一个协议,这意味着它不能被视为泛型类型(不能专门化非泛型类型“P”
),即使它可能具有给定的关联类型
事实上,由于它有一个关联类型
,您现在甚至不能直接使用协议类型本身–您只能将其用作通用约束
解决问题的一个方法是简单地将函数签名更改为createC()->C
,因为这正是它返回的结果
class Factory {
func createC<T>() -> C<T> {
return C<T>()
}
}
类工厂{
func createC()->AnyP{
返回AnyP(C())
}
}
Swift 5.1支持使用不透明类型返回关联类型。使用不透明类型,代码将成功生成
协议P{
关联T型
func get()->T?
func集(v:T)
}
丙级:P{
私人变量v:T?
func get()->T{
返回v
}
func集(v:T){
自我评价,自我评价
}
}
阶级工厂{
func createC()->一些P{
返回C()
}
哪些行有错误?我想我很清楚#2在哪里,而不是#1。@TroyT使用codefunc createC()->P{
的行现在有什么变化吗?
class AnyP<T> : P {
private let _get : () -> T?
private let _set : (T) -> ()
init<U:P where U.T == T>(_ base:U) {
_get = base.get
_set = base.set
}
func get() -> T? {return _get()}
func set(v: T) {_set(v)}
}
class Factory {
func createC<T>() -> AnyP<T> {
return AnyP(C<T>())
}
}
protocol P {
associatedtype T
func get() -> T?
func set(v: T)
}
class C<T>: P {
private var v: T?
func get() -> T? {
return v
}
func set(v: T) {
self.v = v
}
}
class Factory {
func createC<T>() -> some P {
return C<T>()
}