2017-11-07 8 views
0

一般的な制約を記述すると、通常の型にのみ適合しますが、オプションの型には適合しません。私はオプションの型:Type 'SomeType? does not conform to protocol SomeProtocol'と呼びますが、それはコンパイラエラーにつながります。ここでSwiftのオプションタイプのジェネリック制約を書き込む方法は?

はサンプルコードです:

更新
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

[Swiftプロトコル準拠の拡張に型制約を追加することは可能ですか?](https://stackoverflow.com/questions/33332613/is-it-possible-to-add-type-constraints-to -a-swift-protocol-conformance-extension) –

答えて

1

現在、これはできません。

extension Optional: P where Wrapped == Int {} 

我々はWrappedはコンパイラが「制約と拡張が継承句を持つことができない」と文句を言うだろうIntに拘束された場合Optionalを拡張しようとします。

注:これは現在、SE-0143提案の下で作業されており、今後のバージョンのSwiftに届くはずです。

+0

私はそれを今解決します。 OPを参照してください。 –

関連する問題