【问题标题】:Why can I pass [UInt8] type to the UnsafePointer<UInt8> type parameter?为什么我可以将 [UInt8] 类型传递给 UnsafePointer<UInt8> 类型参数?
【发布时间】:2021-06-18 02:42:34
【问题描述】:

我们都知道[UInt8]类型不等于UnsafePointer

但是为什么我可以将 [UInt8] 类型传递给 UnsafePointer 类型参数:

let p = UnsafeMutablePointer<UInt8>.allocate(capacity: 4)
p.initialize(repeating: 0, count: 4)

let ary:[UInt8] = [1,2,3,4]
p.assign(from: ary, count: 4)  // It's OK, why?

如上图,p.assign方法的第一个参数类型是UnsafePointer,但是我传递类型[UInt8]的时候就可以了...

这是为什么呢?谢谢! ;)

【问题讨论】:

    标签: swift unsafe-pointers


    【解决方案1】:

    这只是一个捷径。

    一个不安全的指针实际上是一个 C 数组:我们指向的是一个连续内存块的第一个地址。因此,当你有一个 Swift 数组要写入内存时,Swift 会给你一些很好的帮助:这个 Swift 数组与 C 数组完全不同,但是,你可以传递一个指向 Swift 数组的指针,甚至是Swift 数组本身,包括一个数组字面量,Swift 只会做正确的事。

    【讨论】:

    • 我认为 C 数组只是一个不安全的指针 ;)
    • @Alexander 令人惊讶的是,前几天我试图调用我从 Swift 编写的一些 C 代码,而数组 (int foo[10];) 被桥接到了元组中!由于某种原因,一些非常长的 C 数组完全无法从 Swift 中访问(可能超过了元组元素的最大数量)。
    • @Sweeper 哈哈是的,真的很烦人。 Swift 并没有能力在这样的元组上表达迭代,这使得情况变得更糟。从好的方面来说,同质类型的元组可以保证在内存中连续存储,so you can use Unsafe(Mutable)BufferPointer to handle them like a Collection
    • @matt 谢谢!但为什么我不能这样做:if let p1 = ary as? UnsafePointer {/*...*/} ,它告诉我:从 '[UInt8]' 转换为不相关类型 'UnsafePointer' 总是失败!
    • 因为它们不相关。你看过我的回答吗? “Swift 数组与 C 数组完全不同” 但是,当您传递一个需要指针的数组时,为了方便起见,魔术会在幕后发生。
    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2020-10-27
    相关资源
    最近更新 更多