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)
我有一些 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)