我正在查看一些开源库,如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
答案 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") }
}
代码不再编译。