为什么我不能初始化斯威夫特UnsafeMutablePointer 与(&myUInt32)或

2019-10-22 22:17发布

该文件说:“当一个函数被声明为接受的UnsafeMutablePointer的说法,它可以接受任何其操作数的类型类型,这是作为左值的转交地址的存储左值以下...一个进出的表达“。 我可以复制的例子,证明这一点。

func takesAMutablePointer<T>(x: UnsafeMutablePointer<T>) -> UnsafeMutablePointer<T>
    {
        return x
    }

func useAMutablePointer()
    {
        var legInt :UInt32 = 42
        var legIntArray: [UInt32] = [legInt]
        var legIntPtr: UnsafeMutablePointer<UInt32>
        legIntPtr = takesAMutablePointer(&legInt)
        legIntPtr = takesAMutablePointer(&legIntArray)
        legIntPtr = UnsafeMutablePointer(&legInt) //Compile error!
        legIntPtr = UnsafeMutablePointer(&legIntArray) //Compile error!
    }

Xcode中显示,UnsafeMutablePointer有以下初始化:

init<U>(_ from: UnsafeMutablePointer<U>)但是当我尝试使用它就像我的函数,编译错误是Cannot find an initializer for type 'UnsafeMutablePointer<T>' that accepts an argument list of type '(inout UInt32)'所以,

  1. 有什么直接的方式来获得一个UnsafeMutablePointer<UInt32>到legInt?
  2. 为什么我不能用初始化如预期?

谢谢!

Answer 1:

我感到有点推测这里,但原因似乎是UnsafeMutablePointer<T>通用的初始化

init<U>(_ from: UnsafeMutablePointer<U>)

其中<U>无关<T> 。 看来,编译器不能推断出类型<U>

legIntPtr = UnsafeMutablePointer(&legInt) //Compile error!

只是为了确认这个猜想,我们可以定义自定义扩展

extension UnsafeMutablePointer {
    init(_ from : UnsafeMutablePointer<T>) {
    // Swift 2: init(_ from : UnsafeMutablePointer<Memory>) {
        self = from
    }
}

它初始化来自相同类型的另一个指针的指针。 现在,所有的代码编译和按预期工作。

你可以做的是使用withUnsafeMutablePointer()

legIntPtr = withUnsafeMutablePointer(&legInt, { $0 })

但是,请记住,编译器就不会追踪该指向对象为基准,并可能会破坏对象。 这就是为什么这些指针是“不安全”。 通常你应该使用指针仅内部 withUnsafeMutablePointer()关闭。



文章来源: Why can’t I initialize a Swift UnsafeMutablePointer with (&myUInt32) or (&[myUInt32])