返回专用类型的通用协议swift的方法
我有一个通用协议,它有一个返回通用参数的方法。该协议有两种实现,都以字符串作为返回类型。我需要一个方法来基于一些参数构建一个类似于类集群的特定实例。该方法约束泛型类型,但尝试返回时出错: “无法将StringReturn类型的返回表达式转换为返回类型T”返回专用类型的通用协议swift的方法,swift,generics,protocols,opaque-types,Swift,Generics,Protocols,Opaque Types,我有一个通用协议,它有一个返回通用参数的方法。该协议有两种实现,都以字符串作为返回类型。我需要一个方法来基于一些参数构建一个类似于类集群的特定实例。该方法约束泛型类型,但尝试返回时出错: “无法将StringReturn类型的返回表达式转换为返回类型T” 协议通用协议{ 类型别名返回类型 func doSomething()->ReturnType } StringReturn结构:GenericProtocol{ func doSomething()->字符串{ 返回“第一” } } 结构An
协议通用协议{
类型别名返回类型
func doSomething()->ReturnType
}
StringReturn结构:GenericProtocol{
func doSomething()->字符串{
返回“第一”
}
}
结构AnotherStringReturn:GenericProtocol{
func doSomething()->字符串{
返回“另一个”
}
}
func生成(参数:字符串)->T{
如果{
return字符串return()
}否则{
返回另一个字符串返回
}
}
您试图实现的是使用泛型函数来创建使用Swift类型约束的对象实例
请注意Apple文档中的一般语法:
希望有帮助 在最新的Swift版本中,可以使用不透明类型而不是协议泛型来实现 Swift 5.3 您可以将不透明类型视为泛型类型的反面。泛型类型允许调用函数的代码选择该函数参数的类型,并以从函数实现中抽象出来的方式返回值。例如,以下代码中的函数返回的类型取决于其调用方: 在协议名称之前需要关键字some:
func launchOpaqueFighter() -> some Fighter {
XWing()
}
您好,这很好,但我希望函数决定T最终是什么,这可能吗?@LukeDeFeo如果您想基于某些条件返回对象,我想您可以使用带有
GenericProtocol
的常规函数作为返回类型。问题是,您的协议有一个关联类型,ReturnType
,无法将其用作返回类型。是的,因此我无法返回通用协议,因为它有自己的要求,并且只能用作通用约束。非常烦人,我发现通用协议几乎毫无用处:/
func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
// function body goes here
}
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")
protocol Fighter { }
struct XWing: Fighter { }
func launchFighter() -> Fighter {
XWing()
}
let red5 = launchFighter()
func launchOpaqueFighter() -> some Fighter {
XWing()
}