当专门化类型受附加协议约束时,Swift无法专门化通用参数

时间:2019-06-24 08:12:39

标签: swift

想象一下以下情况:

class Food {}

protocol Growable {}

class Animal<T: Food> {}

let animal1 = Animal<Food>() // Ok
let animal2 = Animal<Food & Growable>() // Compile error: 'Animal' requires that 'Food & Growable' inherit from 'Food'

很显然,如果我们有一个Food & Growable类型的变量,那么这个变量也是Food类型的变量。但是T类的通用参数Animal不能专用于类型Food & Growable。为什么会这样?

1 个答案:

答案 0 :(得分:1)

错误消息有些奇怪,但是您尝试执行的操作无效。

您不能使用协议创建泛型。创建泛型时,必须使用具体类型。不是协议。

df['Month_End_Date'] = (pd.to_datetime(df['Month_End_Date'], format='%m/%d/%Y') .dt.to_period('m').dt.to_timestamp()) df['g'] = df.groupby('Month_End_Date').cumcount() df = df.set_index('Month_End_Date') df.loc[df.index[-1] + pd.offsets.MonthEnd(1)] = df.iloc[-1] df = df.groupby('g').resample('d').ffill().reset_index(level=0, drop=True) df2 = df[df.groupby(['g', df.index.to_period('m')]).cumcount() < 28] print (df2.tail()) A B C D g Month_End_Date 2019-06-24 Espeon Evolution 16868 6035 1 2019-06-25 Espeon Evolution 16868 6035 1 2019-06-26 Espeon Evolution 16868 6035 1 2019-06-27 Espeon Evolution 16868 6035 1 2019-06-28 Espeon Evolution 16868 6035 1 不是具体类型

您需要一个子类:

Food & Growable

或者,如果class GrowableFood: Food, Growable { ... } let animal2 = Animal<GrowableFood>() Animal,则可以扩展Food

Growable