/ / Swift dlaczego moje rozszerzenie generatora nie działa? - szybkie, szybkie rozszerzenia, szybkie protokoły

Swift dlaczego moje rozszerzenie generatora nie działa? - szybkie, szybkie rozszerzenia, szybkie protokoły

Myślę, że moje poznanie dla typów / protokołów Swift / generics zostało przepełnione. Używałem wzorca rozszerzania "bajtów strumienia wejściowego", wykonując coś takiego:

extension GeneratorType where Element == UInt8 {
func foobar()  {
...
}
}

W przeszłości działał na proste rzeczy, a dzisiaj grałem z następującymi rzeczami:

protocol Unpackable {
static func unpack(inout input:IndexingGenerator<[UInt8]>) -> Self
}

extension UInt8:Unpackable {
static func unpack(inout input:IndexingGenerator<[UInt8]>) -> UInt8 {
return input.next()!
}
}

extension UInt16:Unpackable {
static func unpack(inout input:IndexingGenerator<[UInt8]>) -> UInt16 {
return UInt16(input.next()!) | (UInt16(input.next()!) << 8)
}
}

Działa w porządku. Ale jeśli spróbuję połączyć je z czymś podobnym

extension GeneratorType where Element == UInt8 {
func unpackAll() -> (UInt8, UInt16) {
return (UInt8.unpack(&self), UInt16.unpack(&self))
}

wtedy pojawia się następujący błąd:

Cannot convert value of type "Self" to expected argument type "IndexingGenerator<[UInt8]>"

Nie dostosowuje się do IndexingGeneratoraGeneratorType? Czy jego elementem nie jest UInt8? Czy błąd w użyciu IndexingGenerator? Nie mogę określić typów argumentów jako GeneratorType (chociaż naprawdę chciałbym móc).

Nadal czekam na migotanie żarówkidla typów Swift. W niektóre dni bardzo lubię ten język. Innymi dniami mam ochotę krzyczeć na mojego psa, próbując go skłonić, a on tylko wpatruje się we mnie bez ruchu, a potem odwraca się i goni ulicą.

Odpowiedzi:

2 dla odpowiedzi № 1

Spróbuj tego:

extension GeneratorType where Element == UInt8 {
func unpackAll() -> (UInt8, UInt16)? {
guard let _self = self as? IndexingGenerator<[Element]> else { return nil }
var vSelf = _self
return (UInt8.unpack(&vSelf), UInt16.unpack(&vSelf))
}
}

Aktualizacja:

protocol Unpackable {
static func unpack<T : GeneratorType where T.Element == UInt8>(inout input:T) -> Self
}

extension UInt8: Unpackable {
static func unpack<T : GeneratorType where T.Element == UInt8>(inout input: T) -> UInt8 {
return input.next()!
}
}

extension UInt16: Unpackable {
static func unpack<T : GeneratorType where T.Element == UInt8>(inout input: T) -> UInt16 {
return UInt16(input.next()!) | (UInt16(input.next()!) << 8)
}
}

extension GeneratorType where Element == UInt8 {
mutating func unpackAll() -> (UInt8, UInt16) {
return (UInt8.unpack(&self), UInt16.unpack(&self))
}
}