2015-12-15 77 views
0

我有一个通用协议,它有一个返回通用参数的方法。协议有两种实现方式,都将字符串作为返回类型。我想要一种方法来构建一个类似于基于某个参数的类集群的特定实例。该方法限制了泛型类型,但有试图返回时的错误:返回专用类型的通用协议swift的方法

“不能类型StringReturn返回表达式转换成返回类型T”

protocol GenericProtocol { 

    typealias ReturnType 

    func doSomething() -> ReturnType 

} 

struct StringReturn : GenericProtocol { 

    func doSomething() -> String { 
     return "first" 
    } 

} 

struct AnotherStringReturn : GenericProtocol { 

    func doSomething() -> String { 
     return "another" 
    } 

} 

func build<T : GenericProtocol where T.ReturnType == String>(param: String) -> T { 

    if .. { 
     return StringReturn() 
    } else { 
     return AnotherStringReturn 
    } 

} 

回答

1

你所想要实现使用泛型函数使用Swift的Type Constraints来创建一个对象的实例。

注意从苹果公司的文件的一般语法:

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { 
    // function body goes here 
} 

在你工作,这是不可能的,在函数执行的时间来推断是什么类型的T因为你没有把它传递给该函数作为参数,因此您不能说输出是什么类型。

如果你想使用的类型约束的通用功能,你可以添加一些init到您的协议,并使用这样的函数:

func build<T : GenericProtocol where T.ReturnType == String>(object: T.Type, param: String) -> T { 
    // Your code here 
    return T.init() 
} 

let str = build(StringReturn.self, param: "name") 

希望它能帮助!

+0

嗨,这很好,但我想要的功能来决定什么T结束了,这可能吗? –

+0

@LukeDeFeo如果你想基于某些条件返回一个对象,我想你可以使用'GenericProtocol'的常规函数​​作为返回类型。问题是你的协议有一个相关的类型'ReturnType',它不可能用它作为返回类型。 –

+0

是的,所以我不会能够返回通用协议,因为它具有自我要求,它只能用作通用约束。很烦人,我发现通用协议几乎是无用的:/ –

相关问题