This question already has answers here:
How to make generics in collection type constraint?
(3个答案)
两年前关闭。
如何将扩展限制为仅在关联类型为可选时匹配?
例如:
protocol FooProtocol: class {
    associatedtype BarType
    var contents: BarType { get }
}

extension FooProtocol where BarType: Optional<Any> {
    func unwrap() -> BarType {
        return self.contents!
    }
}

class BazClass: FooProtocol {
    typealias BarType = String?
    var contents: BarType
}

此错误与扩展的左大括号上的Type 'Self.BarType' constrained to non-protocol type 'Optional<Any>'有关。我也试过用Any?BarType?代替Optional<Any>。最后一个错误用Inheritance from non-named type 'BarType?'代替。

最佳答案

String和Optional是值类型,而不是协议。这就是为什么你不能说BarType: Optional<String>,因为没有任何东西可以从中继承。
您可以使用相同的类型约束(但这仅在Swift 4中可能),在Swift 3.1中似乎也适用:

extension FooProtocol where BarType == String? {
    // ...
}

10-01 17:57