当前位置: 首页 > 面试题库 >

字符串值到UnsafePointer 功能参数行为

齐坚成
2023-03-14
问题内容

我发现以下代码可以编译并运行:

func foo(p:UnsafePointer<UInt8>) {
    var p = p
    for p; p.memory != 0; p++ {
        print(String(format:"%2X", p.memory))
    }
}

let str:String = "今日"
foo(str)

这将打印出来E4BB8AE697A5,并且是UTF8的有效表示形式今日

据我所知,这是未记录的行为。从文档中:

当一个函数被声明为带有UnsafePointer参数时,它可以接受以下任何一项:

  • nil,作为空指针传递
    * UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要时将其转换为UnsafePointer
  • 一个In-out表达式,其操作数是Type类型的左值,作为左值的地址传递
  • 一个[Type]值,该值作为指向数组开头的指针传递,并在调用期间进行生命周期扩展

在这种情况下,str不是他们。

我想念什么吗?

添加

如果参数类型是 UnsafePointer<UInt16>

func foo(p:UnsafePointer<UInt16>) {
    var p = p
    for p; p.memory != 0; p++ {
        print(String(format:"%4X", p.memory))
    }
}
let str:String = "今日"
foo(str)
//  ^ 'String' is not convertible to 'UnsafePointer<UInt16>'

即使内部String表示形式为UTF16

let str = "今日"
var p = UnsafePointer<UInt16>(str._core._baseAddress)
for p; p.memory != 0; p++ {
    print(String(format:"%4X", p.memory)) // prints 4ECA65E5 which is UTF16 今日
}

问题答案:

之所以如此,是因为Swift团队自首次发布以来就进行了互操作性更改-
您说对了,看来它还没有纳入文档范围。StringUnsafePointer<UInt8>需要的地方工作,因此您可以调用需要const char *参数的C函数,而无需进行大量额外工作。

查看strlen在“ shims.h”中定义的C函数:

size_t strlen(const char *s);

在Swift中,它是这样实现的:

func strlen(s: UnsafePointer<Int8>) -> UInt

String无需额外的工作即可调用:

let str = "Hi."
strlen(str)
// 3


 类似资料:
  • 问题内容: 我有一个ac api返回一个以null终止的字符串,该字符串是类型数组(将对应于)。 Swift具有初始值设定项,但参数必须为(aka ),并且在两者之间没有简单的转换方法。 如何从以null终止的c字符串转换为Swift字符串? 问题答案: 在Swift 3中,有两个初始化程序 因此,可以从(空终止)有符号和无符号字符序列创建它。所以 应该工作。 有另一个初始化器 该 失败 上形成不

  • 我试图运行一个Selenium脚本与运行它的选项使用chrome或headless驱动程序。这可能不是正确的实现方法,但这是我的第一个想法。解决办法可能是完全避免这种情况... 起作用的示例: envDomain标记也按预期工作,所以我不确定为什么driverName参数会以不同的方式工作。

  • 问题内容: 当我使用的方法时 我不知道如何转换 为和长度 如何迅速做到这一点? 问题答案: 您必须先将字符串转换为UTF-8数据 然后将其写入输出流 该转换是必要的,因为有型,而不是如预期的 方法。 Swift 3更新:

  • 问题内容: 我有一个关于JAXB的简单问题。这是示例代码: 如何初始化使用其他对象的String的输入元素? 问题答案: 您可以直接创建一个实例,或者如果您是从XML模式生成的Java模型,请在生成的类上使用convience方法。 schema.xsd 上面的演示代码基于从以下XML模式生成的Java模型。你会得到一个原因摆在首位属性是当你有一个既是元素和。 根 以下类是从中生成的,并且包含与您

  • 本文向大家介绍ES6字符串模板,剩余参数,默认参数功能与用法示例,包括了ES6字符串模板,剩余参数,默认参数功能与用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ES6字符串模板,剩余参数,默认参数功能与用法。分享给大家供大家参考,具体如下: 这里介绍一下字符串模板以及剩余参数,默认参数的概念以及使用。 先来说说字符串模板。 字符串模板 ES6中允许使用反引号 ` 来创建字符串,此

  • 这可能是非常基本的东西,但我很难弄清楚我哪里出错了。 我试图从帖子正文中获取一个字符串,但“jsonString”只显示为null。我还想避免使用模型,但这可能是不可能的。我与PostMan接触到的一段代码是: 也许这是我在postman上做得不正确的地方,但我一直在尝试在body-x-www-form-urlencoded部分的值部分使用“=test”(如在有关此主题的其他问题中看到的),键为j