2017-04-07 3 views
0

함수 인수 유형이 프로토콜을 채택하는 유형에 따라 달라지는 신속한 프로토콜을 어떻게 선언 할 수 있습니까?신속한 프로토콜 정의에서 템플릿 유형 사용

뭔가 배경

protocol EndianConvertible<T> { 
     init(litteEndian: T); 
     func 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) 
    } 
} 

입니다 (litteEndian는 : T)이 가능하고 확실한 방법은를 가진 것 같았다 수정 프로토콜을 추가합니다.

+0

프로토콜이 허용하지 않는 일반 매개 변수, 위의 첫 번째 조각에 대한 그래서, 당신은 오히려 사용할 수를 (프로토콜 Foo {관련 타입 T; 초기화 (litteEndian : T);/* ... * /}'). – dfri

답변

0

당신은 그것을 구현하는 클래스/유형의 구체적인 유형 참조하기위한 프로토콜 자체를 사용할 수 있습니다

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

완벽 함, 자체 작업에 대한 참조. 지금은 다음 문제에있어 : ​​ FUNC의 readUInt32() - 오직 정의와> UINT32 { 반환 readIntLE() } 을 나는 오류 확장 UINT32 '일반 매개 변수 T는 infered 수 없습니다'를 얻기 위 : EndianConvertible { } 'UInt32 형식이 EndianConvertible을 준수하지 않습니다.' –

관련 문제