Как я могу выбрать правильный тип Int во время выполнения - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь определить правильный тип 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, поэтому я надеялся, что смогу вывести тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...