2017-04-07 6 views
0

関数の引数型がプロトコルを採用する型に依存しているswiftで、どのようにしてプロトコルを宣言できますか?迅速なプロトコル定義でのテンプレートタイプの使用

何か

protocol EndianConvertible<T> { 
     init(litteEndian: T); 
     func litteEndian() -> T; 
} 

のような背景: 私は迅速で、リトルエンディアンバイナリストリームのためのストリームデコーダを記述しようとしています。その

パートは、整数のプロトコルはそのINIT(litteEndian:T)を指定しないとコンパイルに失敗した汎用的な機能

class ReadStream { 

var offset : Int = 0; 
var data : Data; 

func readIntLE<T : Integer>() -> T { 
    var d : T = 0 
    let intBits = data.withUnsafeBytes({(bytePointer: UnsafePointer<UInt8>) -> T in 
     bytePointer.advanced(by: offset).withMemoryRebound(to: T.self, capacity: MemoryLayout<T>.size) { pointer in 
      offset += MemoryLayout<T>.size 
      return pointer.pointee 
     } 
    }) 
    d = T(littleEndian: intBits) 
    } 
} 

で利用可能であり、それを修正するための明確な方法が持っているように見えましたその仕様を追加するプロトコル。

あなたはそれを実装するクラス/タイプの具体的な型を参照するためのプロトコルで自己を使用することができます
+0

上記の最初のスニペットのために、あなたはむしろ使うことができるようにするプロトコルは、一般的なパラメータを許可していません。 (プロトコルFoo {関連するタイプT; init(litteEndian:T);/* ... * /} ')。 – dfri

答えて

0

protocol EndianConvertible 
{ 
     init(litteEndian: Self); 
     func litteEndian() -> Self; 
} 
+0

パーフェクト、セルフ作品への言及。 > UInt32型{ リターンreadIntLE() } 私はエラー 'ジェネリックパラメータTは をinferedすることができませんでした' 拡張するUInt32を取得する上記の定義だけでは - readUInt32()FUNC :今、私は次の問題によ:EndianConvertible { } 'タイプUInt32がEndianConvertibleに準拠していません' –

関連する問題