[英]Method to return specialised type of generic protocol 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
}
}
您想要实现的是使用泛型函数使用 Swift 的类型约束创建对象的实例。
请注意 Apple 文档中的一般语法:
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")
希望能帮助到你!
在最新的 Swift 版本中,可以使用不透明类型而不是协议泛型来实现。
斯威夫特 5.3
您可以将不透明类型视为与泛型类型相反的类型。 泛型类型让调用函数的代码选择该函数参数的类型并以一种从函数实现中抽象出来的方式返回值。 例如,以下代码中的函数返回一个依赖于其调用者的类型:
protocol Fighter { }
struct XWing: Fighter { }
func launchFighter() -> Fighter {
XWing()
}
let red5 = launchFighter()
它需要在您的协议名称之前使用关键字some :
func launchOpaqueFighter() -> some Fighter {
XWing()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.