swift - 如何使用带有类型别名的协议(protocol)作为函数参数?

标签 swift swift2

以下代码:

protocol ProtocolA {
}

protocol ProtocolB {
    typealias T: ProtocolA
    var value : Array<T> { get set }
}

class ProtocolC {
    func method<T: ProtocolA>(value: ProtocolB<T>)
    {

    }
}

产生这些错误:

error: cannot specialize non-generic type 'ProtocolB'
func method<T: ProtocolA>(value: ProtocolB<T>)

error: generic parameter 'T' is not used in function signature
func method<T: ProtocolA>(value: ProtocolB<T>)

error: protocol 'ProtocolB' can only be used as a generic constraint because it has Self or associated type requirements
func method<T: ProtocolA>(value: ProtocolB<T>)

谁能解释一下为什么这是不可能的?这是错误还是故意的?

最佳答案

您不能使用 <> 专门化通用协议(protocol) .

相反,您可以:

func method<B: ProtocolB where B.T: ProtocolA>(value: B) {
}

也就是说,method接受 B其中 B符合 ProtocolB它的T 符合 ProtocolA .

而且,在这种情况下,您不需要 where B.T: ProtocolA因为这很明显。

func method<B: ProtocolB>(value: B) {
    ...
}

关于swift - 如何使用带有类型别名的协议(protocol)作为函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238469/

相关文章:

ios - 构建 map 应用程序 ios 时出现 fatal error

swift - 将项目迁移到 swift 3 时的 withSender 后缀

Swift - Init 方法和随机化不起作用

ios - Coredata 链接关系

ios - 无法在 swift2 中声明类扩展

Swift:获取变量的编译时名称(引用一个类)

ios - 符合 Equatable 的单元测试策略

ios - 在不压缩的情况下调整 UIImage 的大小

ios - 火力地堡, swift : `runTransactionBlock()` returns null

swift - expectationForPredicate 失败测试用例