我试图制作一个通用方法,该方法接受一个set.intersection
和一个df['Keyword1'] = df['Description'].apply(lambda x: ', '.join(set(x.split()).intersection(s)))
以便使其可注入(例如,在生产代码中为TopLevelEncoder
,对于生产代码中为TopLevelDecoder
测试)。由于这两个协议都有关联的类型,因此我限制了它们的类型,而不仅仅是执行JSONEncoder
。我想出了这种方法:
CustomEncoder
编译器给我以下错误消息:encoder: TopLevelEncoder = JSONEncoder()
。我不明白如何将其转换为类型func test<Encoder, Decoder>(
encoder: Encoder = JSONEncoder(),
decoder: Decoder = JSONDecoder()
) where Encoder: TopLevelEncoder, Decoder: TopLevelDecoder {
//encode and decode
}
,因为Default argument value of type 'JSONEncoder' cannot be converted to type 'Encoder'
继承自Encoder
。
我可能会误解泛型和JSONEncoder
的工作方式,但是我也无法绕过此错误消息。有人可以帮我吗?
我已经看到了解决此问题的其他方法,例如创建了一个像TopLevelEncoder
这样的新协议,并用它扩展了associatedType
。但是我认为使用现有协议会更清洁。另外,由于我正在使用AnyEncoder
s JSONEncoder
(TopLevelDecoder
),因此我的方法也需要URLSessions
。
答案 0 :(得分:0)
我不知道在这种情况下强制施放有多么安全,但这似乎可以编译并起作用:
struct User: Codable {
var name: String
}
func decodeEncode<Encoder, Decoder>(
encoder: Encoder = JSONEncoder() as! Encoder,
decoder: Decoder = JSONDecoder() as! Decoder)
where Encoder: TopLevelEncoder, Decoder: TopLevelDecoder,
Encoder.Output == Data, Decoder.Input == Data
{
let bruceData = try! encoder.encode(User(name: "Bruce Lee"))
let bruce = try! decoder.decode(User.self, from: bruceData)
print("bruce: \(bruce)")
}
decodeEncode(encoder: JSONEncoder(), decoder: JSONDecoder())
可以约束Encoder.Output == Decoder.Input
,但是我明确指定了Data
,因为JSONEncoder
和JSONDecoder
都可以与Data
一起使用。