/ / Swift защо моето разширение на протокола за генератор не работи? - бързи, бързи разширения, бързи протоколи

Swift защо не работи разширението на протокола за генератор? - бързи, бързи разширения, бързи протоколи

Мисля, че моето познание за Swift типове / протоколи / генерични лекарства е препълнено. Използвах модела за разширяване на "байтове за входния поток", като направя нещо като:

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

Той е работил в миналото за прости неща и днес играя със следното:

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)
}
}

Работи добре. Но ако се опитам да ги сложа заедно с нещо подобно

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

след това получавам следната грешка:

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

Не се съобразява с индексиращия генераторGeneratorType? Неговият елемент не е UInt8? Грешка ли е при използването на индексиращия генератор? Не мога да посоча типовете аргументи като GeneratorType (макар че аз наистина исках да мога).

Аз все още чакам светлината да мигаза тип Swift. Няколко дни наистина харесвам езика. В други дни се чувствам като да крещя, че кучето ми се опитва да го накара да дойде, и той просто ме гледа без да се движи, после се обръща и гони по улицата така или иначе.

Отговори:

2 за отговор № 1

Опитайте тази:

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))
}
}

Update:

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))
}
}