swift – 字符串值为UnsafePointer函数参数行为

前端之家收集整理的这篇文章主要介绍了swift – 字符串值为UnsafePointer函数参数行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我发现以下代码编译和工作:
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表示

据我所知,这是无证的行为.从the document:

When a function is declared as taking a UnsafePointer argument,it can accept any of the following:

@H_403_10@
  • nil,which is passed as a null pointer
  • An UnsafePointer,UnsafeMutablePointer,or AutoreleasingUnsafeMutablePointer value,which is converted to UnsafePointer if necessary
  • An in-out expression whose operand is an lvalue of type Type,which is passed as the address of the lvalue
  • A [Type] value,which is passed as a pointer to the start of the array,and lifetime-extended for the duration of the call
  • 在这种情况下,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团队从初始启动以来所做的互操作性更改之一,这是正常的 – 您是对的,它似乎尚未成为文档. String的工作原理是UnsafePointer< UInt8>是必需的,以便您可以调用期望一个const char *参数的C函数,而不需要额外的工作.

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

    size_t strlen(const char *s);

    在Swift它通过如下:

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

    哪些可以使用String调用,而不需要额外的工作:

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

    看看这个答案的修订,看看C-string interop如何随时间而变化:https://stackoverflow.com/a/24438698/59541

    猜你在找的Swift相关文章