gpt4 book ai didi

swift - UnsafePointer 不工作

转载 作者:搜寻专家 更新时间:2023-11-01 07:07:01 25 4
gpt4 key购买 nike

以下单元测试总是失败,因为一些 UnsafePointer 等于其他一些。我观察到至少 3 个字符串的这种行为。我在 High Sierra 版本 10.13.1 (17B48) 上使用 Xcode 版本 9.1 (9B55)。

func testUnsafePointer() {
let a = "aaa"
let b = "bbb"
let c = "ccc"

let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)

print("a: '\(a)', ua: '\(ua)'")
print("b: '\(b)', ub: '\(ub)'")
print("c: '\(c)', uc: '\(uc)'")

XCTAssertTrue(ua != ub)
XCTAssertTrue(ub != uc)
XCTAssertTrue(uc != ua)
}

打印输出与此类似

a: 'aaa', ua: '0x000060c000056a30'
b: 'bbb', ub: '0x00006080000530d0'
c: 'ccc', uc: '0x00006080000530d0'

注意。在 swift Playground 上,一切看起来都很好。

最佳答案

let ua = UnsafePointer<Int8>(a)

init(_ other: UnsafePointer<Pointee>)

UnsafePointer 的初始化程序叫做。 IE。你路过 swift String到采用 UnsafePointer<Int8> 的函数争论。在这种情况下,将创建一个临时 C 字符串表示形式并将其传递给函数,比较 String value to UnsafePointer<UInt8> function parameter behavior .

该临时 C 字符串仅在函数运行期间有效调用,并在返回时,不保证内存指向通过 ua仍然包含该 C 字符串(或任何有效数据)。此外,

let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)

可以为临时 C 字符串使用相同的存储空间,在这种情况下如您所见,指针将相等。


如果你的目的是调用一个 C 函数 const char *参数,那么你可以简单地传递 Swift 字符串。编译器将插入必要的代码来创建 C 字符串表示(在函数调用期间再次有效),如 String value to UnsafePointer<UInt8> function parameter behavior 中所述:

let a = "aaa"
let b = "bbb"
let c = "ccc"

cfunc(a, b, c)

关于swift - UnsafePointer<Int8> 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47295029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com