Objective c 如何使用Dart ffi表示具有int和string声明的ObjC enum AVAudioSessionPortOverride?

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

我正在为颤振开发一个跨平台的声音API。 我们正在尝试停止在API的iOS部分使用Objective C/Swift,并使用Dart ffi作为替代

ffi(外部函数接口)允许dart调用Obj C API

这意味着我们需要创建一个dart库来封装Obj C音频库

在执行此操作时,我们遇到了具有两个声明的
AVAudioSessionPortOverride
enum
AVAudioSessionPortOverrideSpeaker='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值。