繁体   English   中英

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

[英]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要求),而必须使用符合该协议的类型(例如DoubleFloat )。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM