首页 > 解决方案 > 如何在运行时选择正确的 Int 类型

问题描述

我正在尝试确定要在运行时使用的正确 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。

这样做的正确方法是什么?

编辑:回答我想要完成的问题。我的最终目标是拥有一个看起来像这样的函数(我正在努力使这项工作,我知道这不会按原样编译):

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)

这将创建 aUInt16并将其分配给a,其类型为UInt16。指定长度和 对我来说似乎是多余的UInt16,所以我希望我能推断出类型。

标签: swiftgenericsswift5.1

解决方案


推荐阅读