标签: unsafemutablepointer

如何在 swift 4 中使用 UnsafeMutablePointer

Objective-c 有一个指向指针的指针的概念。如果取消引用第一个指针,则可以访问原始指针

void makeFive(int *n) {
    *n = 5;
}

int n = 0;
makeFive(&n);
// n is now 5
Run Code Online (Sandbox Code Playgroud)

当它被桥接到 Swift 3 时,它变成了一个 UnsafeMutablePointer

func makeFive(_ n: UnsafeMutablePointer<Int>) {
    n.memory = 5
}
var n: Int = 0
makeFive(&n)
// n is now 5
Run Code Online (Sandbox Code Playgroud)

但是,从 Swift 4 开始,这种行为发生了变化,并且 memory 属性不再可用。

与 makeFive(_:) 函数等效的 swift 4 是什么?

更新 感谢 Hamish,我现在知道“记忆”已重命名为指针。

swift unsafemutablepointer swift4

8
推荐指数
1
解决办法
1万
查看次数

Swift:无法将'UnsafeMutablePointer'类型的值转换为预期的参数类型'UnsafeMutablePointer'

更新到Swift 3后,我的代码有点问题.转换前我有这个代码:

extension NSData {
  func castToCPointer<T>() -> T {
    let mem = UnsafeMutablePointer<T>.alloc(sizeof(T.Type))
    self.getBytes(mem, length: sizeof(T.Type))
    return mem.move()
  }
}
Run Code Online (Sandbox Code Playgroud)

我把它转换成了这个代码,在第3行我得到了一个错误

...无法将'UnsafeMutablePointer'类型的值转换为预期的参数类型'UnsafeMutablePointer'

extension Data {
  func castToCPointer<T>() -> T{
    let mem = UnsafeMutablePointer<T>.allocate(capacity: MemoryLayout<T.Type>.size)
    self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size)
    //self.copyBytes(to: mem, count: MemoryLayout<T.Type>.size)
    return mem.move()
  }
}
Run Code Online (Sandbox Code Playgroud)

有谁知道怎么摆脱这个?

swift unsafemutablepointer

7
推荐指数
1
解决办法
1万
查看次数

如何将数组转换为UnsafeMutablePointer <UnsafeRawPointer?> Swift 3.0?

这是我在Swift的早期版本中可行的代码:

 let imageOptionsDictKeys = [ kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey,  kCVPixelBufferHeightKey, kCVPixelBufferOpenGLESCompatibilityKey, kCVPixelBufferIOSurfacePropertiesKey]
 let imageOptionsDictValues = [ cvPixelFormatType,  frameW, frameH, boolYES]

 var keyCallbacks = kCFTypeDictionaryKeyCallBacks
 var valueCallbacks = kCFTypeDictionaryValueCallBacks

 let imageOptions = CFDictionaryCreate(kCFAllocatorDefault, UnsafeMutablePointer(imageOptionsDictKeys), UnsafeMutablePointer(imageOptionsDictValues), 4, &keyCallbacks, &valueCallbacks)
Run Code Online (Sandbox Code Playgroud)

在Swift 3.0中进行更改后,我必须将我的键和值数组转换UnsafeMutablePointer<UnsafeRawPointer?>为创建CFDictionary.

这条路:

    let imageOptionsDictKeysPointer =  UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1)
    imageOptionsDictKeysPointer.initialize(to: imageOptionsDictKeys)
Run Code Online (Sandbox Code Playgroud)

出现错误访问错误.

在阅读文档后,我正在尝试编译此代码:

        let imageOptionsDictKeys = [kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey,  kCVPixelBufferHeightKey, kCVPixelBufferOpenGLESCompatibilityKey]
        let imageOptionsDictKeysRawPointer = Unmanaged.passUnretained(imageOptionsDictKeys).toOpaque()
        let imageOptionsDictKeysPointer =  UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: 1)
        imageOptionsDictKeysPointer.initialize(to: imageOptionsDictKeysRawPointer)

        let imageOptionsDictValues = [ cvPixelFormatType,  frameW, frameH, boolYES]
        let imageOptionsDictValuesRawPointer = Unmanaged.passUnretained(imageOptionsDictValues).toOpaque()
        let …
Run Code Online (Sandbox Code Playgroud)

unsafe-pointers ios swift swift3 unsafemutablepointer

6
推荐指数
1
解决办法
4015
查看次数

将代码从Objective-C转换为Swift后,测试用例失败

我正在以Swift风格进行一些按位操作,这些代码最初是用Objective-C/C编写的.我UnsafeMutablePointer用来说明内存地址的起始索引,并UnsafeMutableBufferPointer用于访问范围内的元素.

您可以在此处访问原始的Objective-C文件.

public init(size: Int) {
    self.size = size
    self.bitsLength = (size + 31) / 32
    self.startIdx = UnsafeMutablePointer<Int32>.alloc(bitsLength * sizeof(Int32))
    self.bits = UnsafeMutableBufferPointer(start: startIdx, count: bitsLength)
}

/**
 * @param from first bit to check
 * @return index of first bit that is set, starting from the given index, or size if none are set
 *  at or beyond its given index
 */
public func nextSet(from: Int) -> Int {
    if from …
Run Code Online (Sandbox Code Playgroud)

ios swift unsafemutablepointer

5
推荐指数
1
解决办法
415
查看次数

Swift中的指针

我正在尝试了解Swift中指针的使用,尤其是:Unsafe[Mutable]PointerUnsafeRaw[Mutable]Pointer。关于这个问题,我有几个问题。

  1. UnsafePointer <T>等于const T * Pointer在?和UnsafeMutablePointer <T>等于T * Pointer在C 2

  2. Unsafe[Mutable]Pointer和之间有什么区别UnsafeRaw[Mutable]Pointer

  3. 为什么编译

func receive(pointer: UnsafePointer<Int> ) {
    print("param value is: \(pointer.pointee)")
}

var a: Int = 1
receive(pointer: &a) // prints 1
Run Code Online (Sandbox Code Playgroud)

但这给我一个错误?

var a: Int = 1
var pointer: UnsafePointer<Int> = &a // error : Cannot pass immutable value of type 'Int' as inout argument
Run Code Online (Sandbox Code Playgroud)

pointers unsafe-pointers swift unsafemutablepointer

5
推荐指数
1
解决办法
7371
查看次数

Swift UnsafeMutablePointer:我必须在解除分配之前调用 deinitialize 吗?

给定 的一个实例,在 之前UnsafeMutablePointer调用有什么意义?deinitialize(count:)deallocate(capacity:)

你就不能打电话吗deallocate(capacity:)


我在raywenderlich.com上阅读Unsafe Swift:Using Pointers And Interacting With C文章的“Using Typed Pointers”部分时看到了这一点。

本文包含以下代码,您可以将其添加到 Xcode 中的新 Playground 中。

let count = 2
let stride = MemoryLayout<Int>.stride
let alignment = MemoryLayout<Int>.alignment
let byteCount = stride * count

do {
  print("Typed pointers")

  let pointer = UnsafeMutablePointer<Int>.allocate(capacity: count)
  pointer.initialize(to: 0, count: count)
  defer {
    pointer.deinitialize(count: count)
    pointer.deallocate(capacity: count)
  }

  pointer.pointee = 42
  pointer.advanced(by: 1).pointee = 6
  pointer.pointee
  pointer.advanced(by: 1).pointee

  let bufferPointer = UnsafeBufferPointer(start: pointer, …
Run Code Online (Sandbox Code Playgroud)

memory-management swift unsafemutablepointer

5
推荐指数
1
解决办法
2026
查看次数

将UnsafeMutablePointer转换为UnsafePointer

我在Swift项目中使用的是C库,其中一个函数需要a UnsafePointer<UnsafePointer<UInt8>?>!作为输入输出参数,我应该在其中传递数据。但是问题是我有此数据UnsafeMutablePointer<UnsafeMutablePointer<UInt8>?>!类型。

我的问题是-什么是转换的最有效和最简单的方法UnsafeMutablePointer,以UnsafePointer在斯威夫特3?这些指针在“书面上”并没有太大的区别,与技术环境也没有太大区别,但是我找不到关于该主题的有价值的信息。

任何帮助,将不胜感激。谢谢

pointers unsafe-pointers swift swift3 unsafemutablepointer

5
推荐指数
1
解决办法
844
查看次数

Swift 3中的UnsafeMutablePointer <CFTypeRef>

我试图SecItemCopyMatching在我的钥匙串实用程序类中调用,以便从钥匙串中获取数据,但我遇到了获取result参数的问题,UnsafeMutablePointer<CFTypeRef?>.

最初的声明(在Swift 2中,在迁移到Swift 3之前)是

// query is a dictionary of [String : AnyObject]

var result: Data?
let status = withUnsafeMutablePointer(to: &result) {
    SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
Run Code Online (Sandbox Code Playgroud)

但是在Swift 3中,您现在需要调用.withMemoryRebound才能查看内存.基于Xcode告诉你的事情,我尝试了这个

var result: Data?
let status = withUnsafeMutablePointer(to: &result){
    $0.withMemoryRebound(to: Data.self, capacity: 1){
        SecItemCopyMatching(query as CFDictionary, UnsafePointer($0))
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这样做,我得到一个错误

无法将类型' UnsafePointer<_>'的值转换为预期的参数类型' UnsafeMutablePointer<CFTypeRef?>?'

所以,我尝试使用CFTypeRef而不是Data

var result: CFTypeRef?
let status = withUnsafeMutablePointer(to: &result){
    $0.withMemoryRebound(to: CFTypeRef.self, capacity: 1){
        SecItemCopyMatching(query as CFDictionary, …
Run Code Online (Sandbox Code Playgroud)

unsafe-pointers core-foundation swift swift3 unsafemutablepointer

4
推荐指数
1
解决办法
6103
查看次数

UnsafeMutablePointer.pointee和didSet属性

我在我创建的结构中的一个观察属性上使用UnsafeMutablePointer得到了一些意想不到的行为(在Xcode 10.1,Swift 4.2上).请参阅以下游乐场代码:

struct NormalThing {
    var anInt = 0
}

struct IntObservingThing {
    var anInt: Int = 0 {
        didSet {
            print("I was just set to \(anInt)")
        }
    }
}

var normalThing = NormalThing(anInt: 0)
var ptr = UnsafeMutablePointer(&normalThing.anInt)
ptr.pointee = 20
print(normalThing.anInt) // "20\n"

var intObservingThing = IntObservingThing(anInt: 0)
var otherPtr = UnsafeMutablePointer(&intObservingThing.anInt)
// "I was just set to 0."

otherPtr.pointee = 20
print(intObservingThing.anInt) // "0\n"
Run Code Online (Sandbox Code Playgroud)

看起来,将UnsafeMutablePointer上的指针修改为观察到的属性实际上并不会修改属性的值.此外,将指针指向属性的操作会触发didSet操作.我在这里错过了什么?

pointers swift unsafemutablepointer

4
推荐指数
1
解决办法
97
查看次数

如何投射UnsafeMutableRawPointer!到Swift 3.0或4.0中的UnsafeMutablePointer &lt;Float&gt;?

我正在为我的iOS应用程序使用Accelerate库。几年前,我在Swift 2.0中构建了这个应用程序,并且运行良好。现在,Swift已更新为3.0和4.0,我必须将大多数代码转换为当前语法。我已经运行了转换器,但是仍然有一些语法错误。这是我最难解决的问题。我似乎找不到一种相当简洁的方法来修复它。

我对图像进行了基本的算术运算。这是其中之一:

public func add(_ left: Image, right: Image) -> Image! {
    let results = Image.init(rows: left.size.rows, columns: left.size.columns, pixelSize: left.pixelSize)
    let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data)
    let rightOperand = UnsafeMutablePointer<Float>(right.buffer.data)
    let destination = UnsafeMutablePointer<Float>(results.buffer.data)
    vDSP_vadd(leftOperand, 1, rightOperand, 1, destination, 1, UInt(left.lengthOfBuffer))
    return results
}
Run Code Online (Sandbox Code Playgroud)

该类Image的字段buffer为a vImage_Buffer,其定义如下:

open class Image {

open var buffer: vImage_Buffer

....}
Run Code Online (Sandbox Code Playgroud)

问题: 调用buffer.data返回的类型为UnsafeMutableRawPointer!。该vDSP_add功能需要UnsafeMutablePointer<Float>其参数。我曾经能够立即将其投射到UnsafeMutablePointer<Float>对象上。看起来现在不推荐使用初始化程序。因此,在类似的代码上let leftOperand = UnsafeMutablePointer<Float>(left.buffer.data),我得到了这个错误

Cannot invoke initializer …
Run Code Online (Sandbox Code Playgroud)

ios accelerate-framework swift vimage unsafemutablepointer

3
推荐指数
1
解决办法
1079
查看次数