[英]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.