如何在Swift中为可选类型编写泛型约束?

时间:2017-11-07 12:16:41

标签: swift generics

一旦我写了泛型约束,它只适合普通类型,但不适合可选类型。当我将其称为可选类型时,它将导致编译器错误:Type 'SomeType? does not conform to protocol SomeProtocol'

以下是示例代码:

protocol P {}

class C<T> {}

extension C where T: P {
    static func test() {}
}

extension Int: P {} // OK
C<Int>.test() // OK


extension Int?: P {} // Fail, but I need it
C<Int?>.test() // Fail, but I need it

更新:

我找到了解决问题的方法。

以下是示例代码。

protocol P {}

class C<T> {}

extension C where T: P {
    static func test() {}
}

extension Int: P {} // OK
C<Int>.test() // OK

protocol OptionalProtocol {
    associatedtype WrappedType
}

extension Optional: OptionalProtocol {
    typealias WrappedType = Wrapped
}

extension C where T: OptionalProtocol, T.WrappedType==Int {
    static func test() {}
}

C<Int?>.test() // OK now

1 个答案:

答案 0 :(得分:1)

目前无法做到这一点。

extension Optional: P where Wrapped == Int {}

如果我们尝试将Optional扩展到Wrapped被约束到Int,编译器会抱怨“带有约束的扩展不能有继承子句”。

注意:目前正在根据SE-0143提案进行处理,并且应该会在未来的Swift版本中提供。