[英]Calling function with generic protocol as return type
以下示例应为抽象协议创建具体对象。
class ClassA<T: FloatingPointType> {}
protocol ProtocolA
{
typealias T: FloatingPointType
var value : ClassA<T>? { get set }
}
class ClassImplProtocolA<T: FloatingPointType> : ProtocolA
{
var value : ClassA<T>? {
get {
return nil
}
set {
}
}
}
class Factory
{
class func createProtocol<PA: ProtocolA where PA.T: FloatingPointType>() -> PA
{
let concreteObject = ClassImplProtocolA<PA.T>()
let abstractObject = concreteObject as? PA
return abstractObject!
}
}
现在有两个问题:是否可以避免as? PA
as? PA
? 以及语法如何调用Factory.createProtocol<...>()
?
或者我该如何解决? 我想要的只是一个抽象类型PrtocolA<FloatingPointType>
的对象,而没有暴露ClassImplProtocolA
。
首先你不能避免as? PA
as? PA
因为返回类型由类型推断确定,如下所示:
let prot: ClassImplProtocolA<Double> = Factory.createProtocol()
let prot = Factory.createProtocol() as ClassImplProtocolA<Double>
这种情况下的另一个问题是,您不能将FloatingPointType
用作通用类型(具有Self
要求),而必须使用符合该协议的类型(例如Double
和Float
)。
在Swift的标准库中,他们使用AnySequence
, AnyGenerator
,...(通用结构)以具有具有Self
要求的抽象类型的协议。 不幸的是,您无法创建类型AnyProtocolA<FloatingPointType>
因为通用类型本身具有Self
要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.