我正在写一个C数学库的包装器.每个函数都将一个或两个函数作为参数.但是,这些子函数(以及父函数)的参数不是Swifty -hence包装器.
我已经清理了示例代码,只显示了三个主要部分:c-library函数,将传递给包装器的所需Swift函数(未显示的主体,但包围c-library函数),以及所需的C函数形式.
//C library function, that calls the passed function dozens, hundreds or thousands of times, each time it changes the data provided in p, and uses the output from x
//The Swift arrays are passed as pointers, and the length of the and x array are m and n respectively
returnValue = cLibraryFunc(passedFunc, &p, &x, Int32(m), Int32(n), Int32(itmax), &opts, &info, &work, &covar, &adata)
//I would like to create a Swift function that would look like this (internals could …Run Code Online (Sandbox Code Playgroud) 我目前是我的Swift应用程序上载任务的owncloud iOS库。它是用Objective-C编写的,要求我将传递AutoreleasingUnsafeMutablePointer<NSProgress?>给上载方法。
说我像这样创建一个新对象
let progress: NSProgress? = NSProgress()
Run Code Online (Sandbox Code Playgroud)
如何AutoreleasingUnsafeMutablePointer<NSProgress?>在Swift中获取此对象的?
我通过以下方式尝试了它:
var progress: NSProgress? = NSProgress()
let unsafeAutoreleasingProgressPointer = AutoreleasingUnsafeMutablePointer<NSProgress?>.init(&progress)
Run Code Online (Sandbox Code Playgroud)
但是我得到了
EXC_BAD_ACCESS(代码= 1,地址= 0x15942320)
在执行代码时。我想保留对进度对象的引用,因为我想添加一个观察者回调,该回调以百分比的形式告诉我上传进度(也在示例链接中进行了演示)。
我不明白该如何UnsafeMutablePointer在Swift 3中使用AURenderCallback。
我尝试下面的代码:
import Foundation
import AudioToolbox
let sineFrequency = 880.0
// MARK: User data struct
struct SineWavePlayer {
var outputUnit: AudioUnit? = nil
var startingFrameCount: Double = 0
}
// MARK: Callback function
let SineWaveRenderProc: AURenderCallback = {(inRefCon, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData) -> OSStatus in
var player = UnsafeMutablePointer<SineWavePlayer>(inRefCon)
var j = player.pointee.startingFrameCount
let cycleLength = 44100 / sineFrequency
for frame in 0..<inNumberFrames {
var buffers = UnsafeMutableAudioBufferListPointer(ioData)
UnsafeMutablePointer<Float32>(buffers[0].mData)[Int(frame)] = Float32(sin(2 * M_PI * …Run Code Online (Sandbox Code Playgroud) var a = [1,2,3]
let ptr1 = UnsafeMutablePointer<Int>(&a[0]) //works fine
let index = 0
let ptr2 = UnsafeMutablePointer<Int>(&a[index]) //compiler throws error
Run Code Online (Sandbox Code Playgroud)
error:无法为类型
UnsafeMutablePointer<Int>为参数列表的类型调用初始值设定项(inout Int)
为什么后者不编译?这里有什么我想念的吗?
我想做一个下面的片段.
class Holder {
var numbers: [Int] = [1,2,3,4]
var modifier: Modifier
init(index: Int) {
self.modifier = Modifier(UnsafeMutablePointer(&self.numbers) + index)
}
}
class Modifer {
var ptr: UnsafeMutablePointer<Int>
init(_ ptr: UnsafeMutablePointer<Int>) {
self.ptr = ptr
}
func change(to: Int) {
self.ptr.pointee = to
// expected the change to be reflected in numbers array …Run Code Online (Sandbox Code Playgroud) 我正在尝试将目标 c 代码转换为 swift。
UInt8* data = calloc(bytesPerRow, height);
Run Code Online (Sandbox Code Playgroud)
当我快速转换它时,它返回“UnsafeMutableRawPointer”。我需要 UInt8。
let data = calloc(bytesPerRow, height)! // UnsafeMutableRawPointer
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的解决方案,但对我不起作用。谁能告诉我如何解决这个问题。谢谢
“UnsafeMutableRawPointer”类型的值没有下标
SWIFT代码。
// data pointer – stores an array of the pixel components. For example (r0, b0, g0, a0, r1, g1, b1, a1 .... rn, gn, bn, an)
//*calloc(size_t __count, size_t __size) __result_use_check __alloc_size(1,2);
let data = calloc(bytesPerRow, height)!
// get new RGB color space
let colorSpace = CGColorSpaceCreateDeviceRGB()
// create bitmap context
let ctx = CGContext(data: data, width: width, height: …Run Code Online (Sandbox Code Playgroud) 我试图使用以下代码获取UnsafeMutableBufferPointer,它有时在Playground中工作,它也失败了
let array : [Character] = ....
func getUnsafeMP(array: [Character]) -> UnsafeMutableBufferPointer<Character> {
let count = array.count
let memory = UnsafeMutablePointer<Character>(allocatingCapacity: count)
for (index , value) in array.enumerated() {
memory[index] = value //it fails here EXC_BAD_ACCESS
}
let buffer = UnsafeMutableBufferPointer(start: memory, count: count)
return buffer
}
Run Code Online (Sandbox Code Playgroud) 我在OC中使用此功能
CAMediaTimingFunction *function = [CAMediaTimingFunction functionWithName:
kCAMediaTimingFunctionDefault];
//get control points
CGPoint controlPoint1, controlPoint2;
[function getControlPointAtIndex:1 values:(float *)&controlPoint1];
[function getControlPointAtIndex:2 values:(float *)&controlPoint2];
NSLog(@"%@, %@", NSStringFromCGPoint(controlPoint1), NSStringFromCGPoint(controlPoint2));
//{5.2386907149499368e-11, 7.9050503334599447e-323}, {0.0078125018189894035, 4.9406564584124654e-324}
Run Code Online (Sandbox Code Playgroud)
但如何将其转换为swift3.1,我这样做,但有些不对劲!
let timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault)
var point1 = Float(0.0), point2 = Float(0.0)
timingFunction.getControlPoint(at: 1, values: &point1)
timingFunction.getControlPoint(at: 2, values: &point2)
print("\(String(describing: point1)),\(String(describing: point2))")
// 0.25,0.25
Run Code Online (Sandbox Code Playgroud)
怎么解决?我需要一些帮助.注意代码打印.