Swift:通用协议

Swift: Generic Protocols

我有一些 swift 结构,这些结构的协议遵从性是通过具有相同方法名称的单独扩展生成的,这些方法名称仅在 return 依赖于结构的类型上有所不同。最重要的是,我想在一个泛型函数中使用它们,该函数为泛型类型调用一个符合协议的函数)。 我试图像那样完成这个: //: 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: 注意:协议需要函数 'createMe()' 类型为 ' () -> T'(又名 '<τ_1_0> () -> τ_1_0') 静态函数 createMe()->T;

这里到底有什么不符合规定的,有解决方法吗?

您的代码有几个问题。一方面,您已经定义了一个具有关联类型的协议。但是,您将 createMe() 方法定义为使用其他类型的泛型。我不认为那是你的意图。我认为您的意图是拥有一个 returns 与协议关联类型相同类型的 createMe() 方法。在这种情况下,您需要从 createMe() 方法中删除。此外,名称 createMe() 暗示您不只是返回任何类型,而是返回调用此方法的对象的类型。在这种情况下,您甚至不需要关联的类型协议。您只需要一个带有 Self 约束的协议,它可以让您的代码更简单一些。在您的 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)

这是在协议中使用初始值设定项而不是静态方法的替代解决方案。

protocol FooProt {
    init()
}


struct FooStruct{
}


extension FooStruct: FooProt {
}


class Creator{
    func createOne<T:FooProt>(type: T.Type) -> T {
        return T.init()
    }
}


let foo = Creator().createOne(FooStruct.self)