使用通用协议调用函数作为返回类型

时间:2015-08-27 18:29:39

标签: swift swift2

以下示例应为抽象协议创建具体对象。

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

1 个答案:

答案 0 :(得分:1)

首先你无法避免as? PA,因为返回类型是由类型推断决定的,如下所示:

let prot: ClassImplProtocolA<Double> = Factory.createProtocol()
let prot = Factory.createProtocol() as ClassImplProtocolA<Double>

在这种情况下的另一个问题是,您不能将FloatingPointType用作通用类型(具有Self要求),并且您必须使用符合此协议的一个(例如Double和{ {1}})。

在Swift的标准库中,他们使用FloatAnySequence,...(通用结构)以获得具有AnyGenerator要求的抽象类型的协议。遗憾的是,您无法创建类型Self,因为泛型类型本身具有AnyProtocolA<FloatingPointType>要求。