Objective c 如何使用Dart ffi表示具有int和string声明的ObjC enum AVAudioSessionPortOverride?
我正在为颤振开发一个跨平台的声音API。 我们正在尝试停止在API的iOS部分使用Objective C/Swift,并使用Dart ffi作为替代 ffi(外部函数接口)允许dart调用Obj C API 这意味着我们需要创建一个dart库来封装Obj C音频库 在执行此操作时,我们遇到了具有两个声明的Objective c 如何使用Dart ffi表示具有int和string声明的ObjC enum AVAudioSessionPortOverride?,objective-c,dart,ffi,Objective C,Dart,Ffi,我正在为颤振开发一个跨平台的声音API。 我们正在尝试停止在API的iOS部分使用Objective C/Swift,并使用Dart ffi作为替代 ffi(外部函数接口)允许dart调用Obj C API 这意味着我们需要创建一个dart库来封装Obj C音频库 在执行此操作时,我们遇到了具有两个声明的AVAudioSessionPortOverrideenumAVAudioSessionPortOverrideSpeaker='spkr'和AvaudioSessionPortOverride
AVAudioSessionPortOverride
enumAVAudioSessionPortOverrideSpeaker='spkr'
和AvaudioSessionPortOverrideOne=0
我对这里发生的事情感到困惑,因为其中一个声明是int,而另一个是字符串
我注意到,AVAudioSessionPortOverride
扩展了一个整数,因此字符串是如何处理的。它是否以某种方式转换为int?如果是这样的话,我会如何在dart中做到这一点
以下是我们到目前为止的情况:
class AVAudioSessionPortOverride extends NSUInteger {
const AVAudioSessionPortOverride(int value) : super(value);
static AVAudioSessionPortOverride None = AVAudioSessionPortOverride(0);
static const AVAudioSessionPortOverride Speaker =
AVAudioSessionPortOverride('spkr');
}
'spkr'
实际上是一个int。有关C中这一模糊功能的工作原理的解释,请参见例如
也就是说,如果您查看PortOverride
enum的Swift表示,您将看到:
/// For use with overrideOutputAudioPort:error:
public enum PortOverride : UInt {
/// No override. Return audio routing to the default state for the current audio category.
case none = 0
/// Route audio output to speaker. Use this override with AVAudioSessionCategoryPlayAndRecord,
/// which by default routes the output to the receiver.
case speaker = 1936747378
}
另外,请参见
因此,0
和1936747378
是您应该使用的值。看看这个
NSLog(@"spkr = %x s = %x p = %x k = %x r = %x", 'spkr', 's', 'p', 'k', 'r' );
苹果正在做你的讲师警告你不要做的一切。由于字符串的长度为4个字符(字节),因此您可以不受影响。如果你延长时间,你会得到警告。如上面的代码片段所示,字符串将转换为int。您可以通过逐个访问四个字节并将它们打印为字符来反转它
扰流板-它将打印
spkr = 73706b72 s = 73 p = 70 k = 6b r = 72
您好,'spkr'或类似的基于文本的缩写在Swift中可以工作吗?不,我认为Swift不支持这一点,这就是为什么Swift实现/文档使用结果的int值。