数字基础中的Swift原生格式

时间:2015-11-11 23:03:54

标签: swift

我正在阅读这个问题的答案 - Swift native functions to have numbers as hex string - 而这正是我想要做的。但是,当我在操场上试试这个时:

let str = String(num: 123.55, radix: 16);
print(str)

打印出来:

(123.55, 16)

为什么要这样格式化?

如果我使用整数,即E.G.,123,同样的事情也会发生。

3 个答案:

答案 0 :(得分:1)

我更仔细地阅读了对话,这是“数字”。破坏它的标签。如果我使用String(123,radix:16)它可以正常工作。但是,分数不起作用。我在String(123.55,基数:16)中遇到了运行时错误。

编辑:正如nhgrif指出的那样,现在这是一个编译器错误,而不是运行时错误 - 所以它应该从未被允许过。从XCode版本7.1.1(7B1005)开始就是如此。我相信正在发生的是在第一个参数上创建一个元组的num:label,然后调用String初始化器,它将元组转换为它的字符串表示。我个人原本希望看起来像这样:

let str = String((num: 1, radix: 2));

编译器以相同的方式处理(相同的结果输出)。

答案 1 :(得分:0)

您的问题是,在这种情况下,Swift编译器或init类型的String没有实现从DoubleFloat转换为基本转换函数另一个基础,你可以按照这个问题[{3}}中解释的一些方法加上How to convert float number to Binary?并为你自己做。

调用init的方式如下:

let num = 12355
let str = String(num, radix: 16)
print(str) // prints "3043"

我希望这对你有所帮助。

答案 2 :(得分:0)

您的代码甚至编译(或由Playground解释)是编译器错误。它也可能表示您没有使用最新版本的Xcode,或者您需要清理和放弃Xcode。重建。

您尝试使用的初始值设定项仅针对整数类型定义。

extension String {
    /// Create an instance representing `v` in base 10.
    public init<T : _SignedIntegerType>(_ v: T)
    /// Create an instance representing `v` in base 10.
    public init<T : UnsignedIntegerType>(_ v: T)
    /// Create an instance representing `v` in the given `radix` (base).
    ///
    /// Numerals greater than 9 are represented as roman letters,
    /// starting with `a` if `uppercase` is `false` or `A` otherwise.
    public init<T : _SignedIntegerType>(_ v: T, radix: Int, uppercase: Bool = default)
    /// Create an instance representing `v` in the given `radix` (base).
    ///
    /// Numerals greater than 9 are represented as roman letters,
    /// starting with `a` if `uppercase` is `false` or `A` otherwise.
    public init<T : UnsignedIntegerType>(_ v: T, radix: Int, uppercase: Bool = default)
}

在我的Xcode上,在Playground中,尝试将此初始值设定项与不是_SignedIntegerTypeUnsignedIntegerType的内容一起使用会产生错误。

  

无法为类型&#39;字符串&#39;调用初始值设定项使用类型&#39;(Double,radix:Int)&#39;

的参数列表

enter image description here