0

我有一些 swift 结构,它们的协议合规性是通过具有相同方法名称的单个扩展生成的,这些扩展的返回类型不同,它们依赖于结构。最重要的是,我想在一个泛型函数中使用它们,该函数为泛型类型调用符合协议的函数)。我试图这样做: //: 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;

这里到底有什么不符合的,是否有解决方法?

4

2 回答 2

2

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

这是在协议中使用初始化程序而不是静态方法的替代解决方案。

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)
于 2015-11-19T15:13:26.683 回答