【发布时间】:2015-07-29 14:44:05
【问题描述】:
我有通用的,我希望能够使用特定的约束对其进行初始化。约束仅用于初始化。班上的其他人不在乎。这是一个简化的例子:
struct Generic<T> {
let compare: (T, T) -> Bool
init<T: Equatable>(data: [T]) {
let handler: (T, T) -> Bool = { $0 == $1 }
compare = handler
insert(data)
}
init(compareHandler: (T, T) -> Bool, data[T]) {
compare = self.compareHandler
insert(data)
}
}
您可以看到有两个初始化程序。第二个显然工作正常。但是,在第一个中,本地类型 T 与结构的泛型类型不匹配。因此,例如,尝试插入数据我得到Cannot invoke 'insert' with an argument list of type '([T])'。我是否可以将 Struct 的泛型类型专门用于初始化或特定功能?
注意,我已经尝试init<T where T:Equatable>(data: [T]) 达到同样的效果。
更新
我正在使用以下解决方法:我创建了一个顶级函数并删除了专门的 init:
func equatableHandler<T: Equatable>(left: T, right: T) -> Bool {
return left == right
}
结构的客户端可以使用:Generic(compareHandler: equatableHandler, data: data)进行初始化
使用专门的init 并不是很“方便”,但我认为它对我的目的来说已经足够好了。我不喜欢创建顶级函数,但泛型经常用于“Equatable”泛型,因此我定义一次处理程序供客户使用是有意义的。
【问题讨论】:
-
我现在无法测试,但这可以工作:
init<P: Equatable where T == P>(data: [P]) -
这是一个不错的想法,但它也不起作用。尽管有
T == P条件,编译器仍然认为它们在init函数中不相等。