2016-12-02 4 views
5

[OK]をので、私は次のように定義されたいくつかのクラスがあります。なぜジェネリックスで即座に同じタイプの要件を満たすことができますか?何か方法はありますか?

public final class Process<InputType, OutputType, Memory> 

を、私はInputTypeと OUTPUTTYPEがまったく同じタイプである場合にのみケースのための機能を利用できるようにしたいです。

extension Process where InputType == OutputType { } 

をしかし、これはにつながる: は、だから私はこのように、このようにしようとした同じタイプの要件は、一般的なパラメータInputTypeOutputType同等

だから、私は」になり

もう少し行ってこのようにしようとしました:

func bypass<SameType>() -> Process<SameType, SameType, Memory> where OutputType == InputType {} 

しかし、これは全く同じエラーになります。 それでは、なぜジェネリック型を2つのジェネリック型が等価になるように定義することはできないのですか。私は、このルールに従わないとコンパイル時に失敗するこのケースに対してのみ利用可能な関数を定義したかったのです。

だから今、私はこのようなものを使用しています。具体的なクラスは、アクションのためにトリガされたとき、最終的にのみ実行時に失敗して作成されていない場合でも、だろうが

public static func bypass<SameType>() -> Process<SameType, SameType, Memory> 

extensionまたはfunctionをコンパイルしない(コンパイル時にエラーが発生する)同じタイプの汎用パラメータに定義する方法はありますか?

更新:実装のいくつかの詳細が原因でコードが読めなくなるだろう逃していると、彼らはスウィフト4以降でコンテキスト

答えて

6

に重要ではない、あなたが書くことができます。

public final class Process<InputType, OutputType, Memory> { 
    // ... 
} 

extension Process where InputType == OutputType { 
    func bypass() -> Process<InputType, OutputType, Memory> { 
     // ... 
    } 
} 

元の回答(スウィフト3):

some changesがSwift 4に入っていても、ジェネリッククラスの型を指定することができます。ただし、プロトコルの型を制約できます。

protocol ProcessProtocol { 
    // I haven't found a way to name these associated type identically to 
    // those in the class. If anyone discover a way, please let me know 
    associatedtype IT 
    associatedtype OT 
    associatedtype MT 
} 

final public class Process<InputType, OutputType, MemoryType>: ProcessProtocol { 
    typealias IT = InputType 
    typealias OT = OutputType 
    typealias MT = MemoryType 

    // your code 
} 

// Note that this is an extension on the protocol, not the class 
extension ProcessProtocol where IT == OT { 
    func foo() { 
     // this function is only available when InputType = OutputType 
    } 
} 
+0

スイフト4が来るまで、これは私の問題を完全に解決します。 –

関連する問題