首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将目标C的回调/关闭转换为Swift

将目标C的回调/关闭转换为Swift
EN

Stack Overflow用户
提问于 2018-08-30 17:17:34
回答 1查看 175关注 0票数 0

因此,我试图在Swift中实现超级功能库,并且在初始化过程中被一个回调所困。我该如何转换这一行:

代码语言:javascript
复制
    __unsafe_unretained Superpowered *self = (__bridge Superpowered *)clientdata;

变成斯威夫特?

以下是简化的目标C实现:

代码语言:javascript
复制
@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版本的开始:

代码语言:javascript
复制
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
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-03 07:25:23

因此,我发现在这个上下文中,我试图转换的self实际上是一个新变量,它提供了对self的__unsafe_unretained引用,就像传递给SuperpoweredIOSAudioIO的初始化器一样。

This answer几乎为我提供了我所需要的一切。Swift 3.3改变了一些事情,这就是我最后得到的结果:

代码语言:javascript
复制
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) // ***
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52102383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档