Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回专用类型的通用协议swift的方法_Swift_Generics_Protocols_Opaque Types - Fatal编程技术网

返回专用类型的通用协议swift的方法

返回专用类型的通用协议swift的方法,swift,generics,protocols,opaque-types,Swift,Generics,Protocols,Opaque Types,我有一个通用协议,它有一个返回通用参数的方法。该协议有两种实现,都以字符串作为返回类型。我需要一个方法来基于一些参数构建一个类似于类集群的特定实例。该方法约束泛型类型,但尝试返回时出错: “无法将StringReturn类型的返回表达式转换为返回类型T” 协议通用协议{ 类型别名返回类型 func doSomething()->ReturnType } StringReturn结构:GenericProtocol{ func doSomething()->字符串{ 返回“第一” } } 结构An

我有一个通用协议,它有一个返回通用参数的方法。该协议有两种实现,都以字符串作为返回类型。我需要一个方法来基于一些参数构建一个类似于类集群的特定实例。该方法约束泛型类型,但尝试返回时出错:

“无法将StringReturn类型的返回表达式转换为返回类型T”

协议通用协议{
类型别名返回类型
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()
}