Я пытаюсь определить правильный тип Int для использования во время выполнения.
По сути, я пытаюсь сделать что-то вроде этого:
func sizeToType<T>(size:UInt8) throws -> T.Type {
switch size {
case 1:
return UInt8.self
case 2:
return UInt16.self
case 4:
return UInt32.self
case 8:
return UInt64.self
default:
throw MyError.runtimeError("Incorrect size")
}
Но это не скомпилируется, и вынудить меня написать это так:
func UTILtoType<T : FixedWidthInteger>(size:UInt8) throws -> T.Type {
switch size {
case 1:
return UInt8.self as! T.Type
case 2:
return UInt16.self as! T.Type
case 4:
return UInt32.self as! T.Type
case 8:
return UInt64.self as! T.Type
default:
throw MyError.runtimeError("Incorrect size")
}
Но я боюсь, что последний на самом деле не будет работать так, как я ожидаю. Я не хочу, чтобы мой UInt8 был "преобразован" в Int.
Какой правильный способ сделать это?
РЕДАКТИРОВАТЬ: ответить на вопрос о том, что я пытаюсь сделать sh. Моя конечная цель состоит в том, чтобы иметь функцию, которая могла бы выглядеть следующим образом (я пытаюсь заставить эту работу работать, я знаю, что она не компилируется как есть):
static func parseInt<T : FixedWidthInteger> (unsafeRawPointer:UnsafeRawPointer, stride: Int, from:Int, length:Int) -> T {
var res : UTILtoType(size:length) = 0
for x in 0..<length {
res += (unsafeRawPointer.advanced(by:(from + x) * stride).load(as:UTILtoType(size:length).self))
}
return res
}
, чтобы я мог получить возможность просто позвоните:
let a = parseInt(unsafeRawPointer:pointer, stride:1, from:0, len:2)
, и это создаст UInt16
и присвоит его a
, который будет иметь тип UInt16
. Мне кажется излишним указывать длину и UInt16
, поэтому я надеялся, что смогу вывести тип.