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

4

当我写了一个通用约束时,它只适用于普通类型而不是可选类型。如果我将其作为可选类型调用,会导致编译器错误: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个回答

1

目前还无法做到这一点。

extension Optional: P where Wrapped == Int {}

如果我们试图扩展Optional,其中Wrapped的限制为Int,编译器将抱怨“带有约束条件的扩展不能具有继承子句”。
注意:这是在SE-0143提案下正在进行的工作,并应在Swift的未来版本中到达。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接