以下单元测试总是失败,因为某些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'
NB。在快速的操场上,一切看起来都不错。
答案 0 :(得分:2)
在
let ua = UnsafePointer<Int8>(a)
init(_ other: UnsafePointer<Pointee>)
UnsafePointer
的初始化程序被调用。即你过世了
一个Swift String
到一个函数UnsafePointer<Int8>
论点。在这种情况下,会创建一个临时 C字符串表示并传递给该函数,
比较String value to UnsafePointer<UInt8> function parameter behavior。
该临时C字符串仅在函数持续时间内有效
调用,并在返回时,不保证内存指向
to ua
仍包含该C字符串(或任何有效数据)。另外,
let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)
在这种情况下,可以为临时C字符串使用相同的存储空间 正如你所观察到的那样,指针是相等的。
如果您打算使用const char *
参数调用C函数,那么您可以简单地传递Swift字符串。编译器
将插入必要的代码以创建C字符串表示
(它们在函数调用期间再次有效),
正如String value to UnsafePointer<UInt8> function parameter behavior中所述:
let a = "aaa"
let b = "bbb"
let c = "ccc"
cfunc(a, b, c)