以下示例应为抽象协议创建具体对象。
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
吗?
语法如何调用Factory.createProtocol<...>()
?
或者我该如何解决这个问题?我想要的只是抽象类型PrtocolA<FloatingPointType>
的对象,而不暴露ClassImplProtocolA
。
答案 0 :(得分:1)
首先你无法避免as? PA
,因为返回类型是由类型推断决定的,如下所示:
let prot: ClassImplProtocolA<Double> = Factory.createProtocol()
let prot = Factory.createProtocol() as ClassImplProtocolA<Double>
在这种情况下的另一个问题是,您不能将FloatingPointType
用作通用类型(具有Self
要求),并且您必须使用符合此协议的一个(例如Double
和{ {1}})。
在Swift的标准库中,他们使用Float
,AnySequence
,...(通用结构)以获得具有AnyGenerator
要求的抽象类型的协议。遗憾的是,您无法创建类型Self
,因为泛型类型本身具有AnyProtocolA<FloatingPointType>
要求。