一旦我写了泛型约束,它只适合普通类型,但不适合可选类型。当我将其称为可选类型时,它将导致编译器错误: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
答案 0 :(得分:1)
目前无法做到这一点。
extension Optional: P where Wrapped == Int {}
如果我们尝试将Optional
扩展到Wrapped
被约束到Int
,编译器会抱怨“带有约束的扩展不能有继承子句”。
注意:目前正在根据SE-0143提案进行处理,并且应该会在未来的Swift版本中提供。