objective-c - swift 中的 Objective C static const

标签 objective-c swift

如何在 Swift 中编写这段 Objective C 代码?

#import "FFTViewController.h"

//only this part
static vDSP_Length const FFTViewControllerFFTWindowSize = 4096;

@implementation FFTViewController 

我的想法是

let vDSP: vDSP_Length = 4096

我确定这不正确,但我不知道。

感谢帮助

更新:

我想将这个 Objective C 代码移植到 swift

#import "FFTViewController.h"

static vDSP_Length const FFTViewControllerFFTWindowSize = 4096;

@implementation FFTViewController


- (void)viewDidLoad
{
[super viewDidLoad];

//
// Setup the AVAudioSession. EZMicrophone will not work properly on iOS
// if you don't do this!
//
AVAudioSession *session = [AVAudioSession sharedInstance];
NSError *error;
[session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if (error)
{
    NSLog(@"Error setting up audio session category: %@", error.localizedDescription);
}
[session setActive:YES error:&error];
if (error)
{
    NSLog(@"Error setting up audio session active: %@", error.localizedDescription);
}

//
// Setup time domain audio plot
//
self.audioPlotTime.plotType = EZPlotTypeBuffer;
self.maxFrequencyLabel.numberOfLines = 0;

//
// Setup frequency domain audio plot
//
self.audioPlotFreq.shouldFill = YES;
self.audioPlotFreq.plotType = EZPlotTypeBuffer;
self.audioPlotFreq.shouldCenterYAxis = NO;

//
// Create an instance of the microphone and tell it to use this view controller instance as the delegate
//
self.microphone = [EZMicrophone microphoneWithDelegate:self];

//
// Create an instance of the EZAudioFFTRolling to keep a history of the incoming audio data and calculate the FFT.
//
self.fft = [EZAudioFFTRolling fftWithWindowSize:FFTViewControllerFFTWindowSize
                                     sampleRate:self.microphone.audioStreamBasicDescription.mSampleRate
                                       delegate:self];

//
// Start the mic
//
[self.microphone startFetchingAudio];
}

这是我的开始

import UIKit
import Accelerate


class ViewController: UIViewController, EZMicrophoneDelegate{

var mic: EZMicrophone!
var fft: EZAudioFFTRolling!
private let FFTViewControllerFFTWindowSize: vDSP_Length = 4096

override func loadView() {
    super.loadView()

    mic = EZMicrophone(delegate: self, startsImmediately: true)
    fft = EZAudioFFTRolling(windowSize: FFTViewControllerFFTWindowSize, sampleRate: mic.audioStreamBasicDescription().mSampleRate, delegate: self)


}


}

我变成了以下错误:

编译失败,出现以下错误: “无法使用类型为‘(windowSize: vDSP_Length, sampleRate: Float64, delegate: ViewController)’的参数列表调用‘EZAudioFFTRolling’类型的初始化程序”

我的问题是什么? 抱歉这个问题,我没有 ObjectiveC 背景,这个端口对我来说挑战不大。

感谢帮助

最佳答案

您遇到的错误是类型问题。当您开始在 XCode 中键入 EZAudioFFTRolling initializer 时,自动完成功能会通过显示规范来帮助您。它看起来像这样:

EZAudioFFTRolling(windowSize: vDSP_Length, sampleRate: Float, delegate: EZAudioFFTDelegate!)

如果您将规范中的参数类型与您传递的实际值进行比较,您会发现 mic.audioStreamBasicDescription().mSampleRate 具有 Float64 类型但应该是 Float(它们实际上不相同)并且 self 不是符合 EZAudioFFTDelegate 协议(protocol)。所以在将你的行更改为这个之后

fft = EZAudioFFTRolling(windowSize: FFTViewControllerFFTWindowSize, sampleRate: Float(mic.audioStreamBasicDescription().mSampleRate), delegate: self)

并添加协议(protocol)一致性,您将能够构建您的代码。

Swift 的类型安全性与 Objective-C 截然不同,因此这是所有 Objective-C 开发人员在开始使用 Swift 时都会遇到的常见问题。但错误实际上是在帮助你,所以请仔细阅读。

关于objective-c - swift 中的 Objective C static const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062220/

相关文章:

ios - 按钮背景颜色动画禁用触摸(IOS)

ios - 解析 GeoPoint 限制

swift - 视觉格式语言中的水平居中

ios - Xcode 不遵守设备方向

iOS - 如何保持两个或多个对象水平居中,同时保持它们之间的空间?

swift - 在 2 个 CGPoint 之间绘制线,而不使用许多 addLine

ios - 如何使用 RxSwift 将一种类型的 Observable 数组转换为不同类型的 Observable 数组

objective-c - 不断替换数组中的对象是否存在任何问题?

iphone - ViewController 响应选择器 :]: message sent to deallocated instance

ios - 过滤关系 Coredata 的子项而不是父项