因此,我试图在Swift中实现超级功能库,并且在初始化过程中被一个回调所困。我该如何转换这一行:
__unsafe_unretained Superpowered *self = (__bridge Superpowered *)clientdata;变成斯威夫特?
以下是简化的目标C实现:
@implementation Superpowered {
SuperpoweredIOSAudioIO *audioIO;
SuperpoweredBandpassFilterbank *filters;
unsigned int samplerate;
}
static bool audioProcessing(void *clientdata, float **buffers, unsigned int inputChannels, unsigned int outputChannels, unsigned int numberOfSamples, unsigned int samplerate, uint64_t hostTime) {
__unsafe_unretained Superpowered *self = (__bridge Superpowered *)clientdata;
if (samplerate != self->samplerate) {
self->samplerate = samplerate;
};
// Update position.
self->lastNumberOfSamples = numberOfSamples;
return false;
}
- (id)init {
self = [super init];
if (!self) return nil;
samplerate = 44100;
audioIO = [[SuperpoweredIOSAudioIO alloc] initWithDelegate:(id<SuperpoweredIOSAudioIODelegate>)self preferredBufferSize:12 preferredMinimumSamplerate:44100 audioSessionCategory:AVAudioSessionCategoryRecord channels:2 audioProcessingCallback:audioProcessing clientdata:(__bridge void *)self];
[audioIO start];
return self;
}以下是我的Swift版本的开始:
func bridge<T : AnyObject>(obj : T) -> UnsafeMutableRawPointer {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
// return unsafeAddressOf(obj) // ***
}
func bridge<T : AnyObject>(ptr : UnsafeMutableRawPointer) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
// return unsafeBitCast(ptr, T.self) // ***
}
open class EchoesEngine: NSObject, CLLocationManagerDelegate, SuperpoweredIOSAudioIODelegate {
public var audioIO:SuperpoweredIOSAudioIO
static var lastNumberOfSamples:UInt32!
static var samplerate:UInt32!
override init() {
super.init()
audioIO = SuperpoweredIOSAudioIO.init(delegate: self, preferredBufferSize: 12, preferredMinimumSamplerate: 44100, audioSessionCategory: AVAudioSessionCategoryPlayAndRecord, channels: 2, audioProcessingCallback: EchoesEngine.audioProcessingCallback, clientdata: bridge(obj: self))
…
}
@objc static let audioProcessingCallback : @convention(c) (UnsafeMutableRawPointer?, UnsafeMutablePointer<UnsafeMutablePointer<Float>?>?, UInt32, UInt32, UInt32, UInt32, UInt64) -> Bool = {
(clientdata, buffers, inputChannels, outputChannels, numberOfSamples, _samplerate, hostTime) in
/*
let unsafePointer = Unmanaged<EchoesEngine>.fromOpaque(clientdata!).takeUnretainedValue()
let pointer = AutoreleasingUnsafeMutablePointer<EchoesEngine>(unsafePointer)
*/
self = bridge(ptr: clientdata!)
if samplerate != _samplerate {
samplerate = _samplerate
}
lastNumberOfSamples = numberOfSamples
return false
}发布于 2018-09-03 07:25:23
因此,我发现在这个上下文中,我试图转换的self实际上是一个新变量,它提供了对self的__unsafe_unretained引用,就像传递给SuperpoweredIOSAudioIO的初始化器一样。
This answer几乎为我提供了我所需要的一切。Swift 3.3改变了一些事情,这就是我最后得到的结果:
func bridge<T : AnyObject>(obj : T) -> UnsafeMutableRawPointer {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
// return unsafeAddressOf(obj) // ***
}
func bridge<T : AnyObject>(ptr : UnsafeMutableRawPointer?) -> T {
return Unmanaged<T>.fromOpaque(ptr!).takeUnretainedValue()
// return unsafeBitCast(ptr, T.self) // ***
}https://stackoverflow.com/questions/52102383
复制相似问题