我有一个协议AProtocol
有一些数据结构,还有一个协议BProtocol
有一个动作,它采用符合AProtocol
的参数。代码如下:
protocol AProtocol {
// data
}
protocol BProtocol {
func action<T: AProtocol>(completionHandle: (Bool, [T]?) -> ())
}
当我实现这些协议时——结构符合
AProtocol
并且类符合BProtocol
,我找不到满足编译器的方法。struct AStruct: AProtocol {
}
class BClass: BProtocol {
var structs = [AStruct]()
func action<T : AProtocol>(completionHandle: (Bool, [T]?) -> ()) {
completionHandle(true, self.structs) // Compile error: "'AStruct' is not identical to 'T'"
}
}
更新时间:
我尝试使用类型转换,但未能调用
action
,并出现另一个错误(“cannot convert the expression's type”(($t4,($t4,$t5)->($t4,$t5)->($t4,$t5)->$t3,(($t4,$t5)->($t4,$t5)->($t3,$t5)->$t3,$t5)->($t4,$t5)->($t3,$t5)->$t3)->($t4,$t5)->$t3)->$t3,($t4,$t5)->$t3,$t5)->$t3)->$t3'输入'aprotocol':class BClass: BProtocol {
var structs = [AStruct]()
func action<T : AProtocol>(completionHandle: (Bool, [T]?) -> ()) {
completionHandle(true, self.structs.map({$0 as T})) // Now the compile error has gone
}
func testAction() {
self.action({ // Compile error: "Cannot convert the expression's type..."
(boolValue, arrayOfStructs) in
if boolValue {
// Do something
}
})
}
}
我想知道我为什么错了,怎么解决这个问题。谢谢您!
最佳答案
你可以用
completionHandle(true, self.structs.map { $0 as T })
我不确定这是一个bug还是某些语言中的限制,这些语言禁止您直接投射这个数组。这可能是不可能的,因为数组是值类型。
更新后的问题:
您已经为action方法指定了泛型类型,因此编译器无法从上下文中获取该类型。您必须明确设置它:
var bClass = BClass()
bClass.action { (boolValue, arrayOfAProtocol: [AProtocol]?) in
if boolValue {
// Do something
}
}