【问题标题】:Swift difference between Value: and Value ==Value: 和 Value == 之间的快速区别
【发布时间】:2015-11-21 21:52:57
【问题描述】:

我正在查看一些开源库,例如 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

【问题讨论】:

    标签: ios swift generics protocols


    【解决方案1】:

    写作

    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") }
    }
    

    代码不再编译。

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 2020-07-12
      • 2023-03-04
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多