我有一些 swift 结构,它们的协议(protocol)遵从性是通过具有相同方法名称的各个扩展生成的,这些方法名称只是它们依赖于结构的返回类型不同。最重要的是,我想在一个泛型函数中使用它们,该函数为泛型类型调用一个符合协议(protocol)的函数)。 我试图像那样完成这个: //: Playground - 名词:人们可以玩耍的地方
import UIKit
protocol FooProt {
typealias T;
static func createMe<T>()->T;
}
struct FooStruct{
}
extension FooStruct: FooProt{
typealias T = FooStruct;
static func createMe () -> FooStruct{
return FooStruct();
}
}
class Creator{
fun createOne<T where T:FooProt>(type:T.Type){
let instance = T.createMe();
}
}
不幸的是,我收到以下错误: /var/folders/sn/78_zvfd15d74dzn01mdv258h0000gq/T/./lldb/3741/playground6.swift:7 :17: 注意:协议(protocol)需要类型为“() -> T”的函数“createMe()”(又名“<τ_1_0>” () -> τ_1_0') 静态函数 createMe()->T;
这里到底有什么不符合规定的,有解决方法吗?
最佳答案
您的代码有几个问题。一方面,您已经定义了一个具有关联类型的协议(protocol)。但是,您将 createMe() 方法定义为使用其他类型的泛型。我不认为那是你的意图。我认为您的意图是拥有一个 createMe() 方法,该方法返回与协议(protocol)关联类型相同的类型。在这种情况下,您需要从 createMe() 方法中删除。此外,名称 createMe() 暗示您不只是返回任何类型,而是返回调用此方法的对象的类型。在这种情况下,您甚至不需要关联的类型协议(protocol)。您只需要一个带有 Self 约束的协议(protocol),它可以让您的代码更简单一些。在您的 Creator 的 createOne 方法中,您的类型约束比需要的更复杂。
我认为您需要以下代码:
protocol FooProt {
static func createMe()->Self;
}
struct FooStruct{
}
extension FooStruct: FooProt {
static func createMe() -> FooStruct {
return FooStruct();
}
}
class Creator{
func createOne<T:FooProt>(type: T.Type) -> T {
return T.createMe()
}
}
let foo = Creator().createOne(FooStruct.self)
关于Swift:通用协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33806044/