我有一个协议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
    }
}

10-05 23:04