Value:和Value ==之间的快速差异

时间:2015-11-21 21:52:57

标签: ios swift generics protocols

我正在查看一些开源库,如ReactiveCocoa和Alamofire,我注意到Signal.swift(ReactiveCocoa)中的这种语法:

extension SignalType where Value: SignalProducerType, Error == Value.Error

我知道Value: SignalProducerType会为通用或关联类型Value添加约束,无论是类约束还是协议约束。但是Value: SignalProducerType与使用==之间的区别是什么?

对于以下设想的例子:

protocol Test {
    typealias Value
}

extension Test where Value: NSObject, Value == NSError {

}

有什么不同
extension Test where Value: NSObject, Value: NSError {

}

这两个例子都是编译的。

延伸到此,你可以用Self做到吗?类似的东西:

extension Test where Self: SomeClass, Self == NSError

1 个答案:

答案 0 :(得分:0)

写作

extension Test where Value: NSObject, Value == NSError {

}

您的扩展名适用于符合Test值等于NSError 的类型。

另一方面

extension Test where Value: NSObject, Value: NSError {

}

当类符合Test并且Value的类型是NSError或子类时,扩展名可用。

实施例

以下代码编译

protocol Test {
    typealias Value
}

extension Test where Value: NSObject, Value : NSError {
    func foo() { }
}

class MyError: NSError {}

class A: Test {
    typealias Value = MyError
}

A().foo()

但是,如果我们将扩展条件中的:替换为=,就像这样

extension Test where Value: NSObject, Value = NSError {
    func foo() { print("foo") }
}

代码不再编译。