簡體   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