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 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的早期版本中可行的代码:
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) 我正在以Swift风格进行一些按位操作,这些代码最初是用Objective-C/C编写的.我UnsafeMutablePointer
用来说明内存地址的起始索引,并UnsafeMutableBufferPointer
用于访问范围内的元素.
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) 我正在尝试了解Swift中指针的使用,尤其是:Unsafe[Mutable]Pointer
和UnsafeRaw[Mutable]Pointer
。关于这个问题,我有几个问题。
是UnsafePointer <T>
等于const T * Pointer
在?和UnsafeMutablePointer <T>
等于T * Pointer
在C 2
Unsafe[Mutable]Pointer
和之间有什么区别UnsafeRaw[Mutable]Pointer
?
为什么编译
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) 给定 的一个实例,在 之前UnsafeMutablePointer
调用有什么意义?deinitialize(count:)
deallocate(capacity:)
你就不能打电话吗deallocate(capacity:)
?
我在raywenderlich.com上阅读Unsafe Swift:Using Pointers And Interacting With C文章的“Using Typed Pointers”部分时看到了这一点。
本文包含以下代码,您可以将其添加到 Xcode 中的新 Playground 中。
Run Code Online (Sandbox Code Playgroud)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, …
我在Swift项目中使用的是C库,其中一个函数需要a UnsafePointer<UnsafePointer<UInt8>?>!
作为输入输出参数,我应该在其中传递数据。但是问题是我有此数据UnsafeMutablePointer<UnsafeMutablePointer<UInt8>?>!
类型。
我的问题是-什么是转换的最有效和最简单的方法UnsafeMutablePointer
,以UnsafePointer
在斯威夫特3?这些指针在“书面上”并没有太大的区别,与技术环境也没有太大区别,但是我找不到关于该主题的有价值的信息。
任何帮助,将不胜感激。谢谢
我试图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
我在我创建的结构中的一个观察属性上使用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操作.我在这里错过了什么?
我正在为我的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)