Swift协议泛型为函数返回类型

我想使用通用协议类型作为函数返回类型,如下所示:

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”未在函数签名中使用

有没有办法用Swift实现类似的功能

解决方法

问题是你不能使用语法P< T>. P是一个协议,意味着它不能被视为泛型类型(不能专门化非泛型类型’P’),即使它可能具有给定的关联类型.

事实上,因为它有一个关联类型,你现在甚至不能直接使用协议类型本身 – 你只能将它用作通用约束.

解决您的问题的一个方法是简单地将您的功能签名更改为createC< T>() – > C< T>,因为它正是它返回的.

class Factory {
    func createC<T>() -> C<T> {
        return C<T>()
    }
}

我不完全确定将返回类型作为协议来获得什么.据推测,您的示例只是对实际代码的简化,并且您希望能够返回符合P的任意实例.在这种情况下,您可以使用type erasure

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>())
    }
}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...