gpt4 book ai didi

ios - 在 XCode 7 中导入带有类别扩展的接口(interface)时编译和运行时失败

转载 作者:搜寻专家 更新时间:2023-11-01 06:39:37 26 4
gpt4 key购买 nike

我正在尝试获取一个使用在 Swift 2.2 (XCode 7.3.1) 中运行的 RapidEars 插件运行 OpenEars 的示例。但是,我怀疑我在 Swift 项目中使用带有扩展的 Objective-C 接口(interface)时遇到了更大的问题(或者我对其工作原理的理解)。

OpenEars 代码是 Obj-C。但是,我能够通过标准的 Obj-C -> Swift 翻译技术让它在我的 swift 项目中运行。

缩写代码如下。完整的例子在一个分支的 Github 上并更新到 Swift-2.2:https://github.com/SuperTango/OpenEars-with-Swift-

下面这个例子运行良好。您可以通过查看“working-opears-swift2.2”标签来查看整个项目。

OpenEarsTest-Bridging-Header.h:

#import <OpenEars/OELanguageModelGenerator.h>
#import <OpenEars/OEAcousticModel.h>
#import <OpenEars/OEPocketsphinxController.h>
#import <OpenEars/OEAcousticModel.h>
#import <OpenEars/OEEventsObserver.h>

ViewController.swift:

class ViewController: UIViewController, OEEventsObserverDelegate {

var openEarsEventsObserver = OEEventsObserver()

override func viewDidLoad() {
super.viewDidLoad()
loadOpenEars()
}

func loadOpenEars() {
self.openEarsEventsObserver = OEEventsObserver()
self.openEarsEventsObserver.delegate = self

var lmGenerator: OELanguageModelGenerator = OELanguageModelGenerator()

addWords()
var name = "LanguageModelFileStarSaver"
lmGenerator.generateLanguageModelFromArray(words, withFilesNamed: name, forAcousticModelAtPath: OEAcousticModel.pathToModel("AcousticModelEnglish"))

lmPath = lmGenerator.pathToSuccessfullyGeneratedLanguageModelWithRequestedName(name)
dicPath = lmGenerator.pathToSuccessfullyGeneratedDictionaryWithRequestedName(name)
}

func startListening() {
do {
try OEPocketsphinxController.sharedInstance().setActive(true)
OEPocketsphinxController.sharedInstance().startListeningWithLanguageModelAtPath(lmPath, dictionaryAtPath: dicPath, acousticModelAtPath: OEAcousticModel.pathToModel("AcousticModelEnglish"), languageModelIsJSGF: false)
} catch {
NSLog("Error!")
}
}

// A whole bunch more OEEventsObserverDelegate methods that are all working fine...
func pocketsphinxDidStartListening() {
print("Pocketsphinx is now listening.")
statusTextView.text = "Pocketsphinx is now listening."
}

到目前为止,一切都运行良好。

但是,为了使用“RapidEars”插件,文档 (http://www.politepix.com/rapidears/) 指出:

  • 将框架添加到项目中并确保它被正确包含。<​​/li>
  • 导入两个新文件(它们都是现有 OpenEars 类的“类别”):

    #import <RapidEarsDemo/OEEventsObserver+RapidEars.h>
    #import <RapidEarsDemo/OEPocketsphinxController+RapidEars.h>
  • 更改使用的方法:startListeningWithLanguageModelAtPath 以使用 startRealtimeListeningWithLanguageModelAtPath

  • 添加两个新的 OEEventsObservableDelegate 方法。

    func rapidEarsDidReceiveLiveSpeechHypothesis(hypothesis: String!, recognitionScore: String!)    
    func rapidEarsDidReceiveFinishedSpeechHypothesis(hypothesis: String!, recognitionScore: String!)

可以通过查看上述 github 存储库中的 rapidears-notworking-stackoverflow 标签找到新代码

问题一:

在 XCode 编辑器中完成时,编辑器会看到 WILL 在 startRealtimeListeningWithLanguageModelAtPath 方法上执行自动完成,但是当代码运行时,它总是失败并出现错误:

[OEPocketsphinxController startRealtimeListeningWithLanguageModelAtPath:dictionaryAtPath:acousticModelAtPath:]: unrecognized selector sent to instance 0x7fa27a7310e0

问题2:

在 XCode 编辑器中执行自动完成时,它看不到 RapidEarsDemo/OEPocketsphinxController+RapidEars.h 中定义的两个新委托(delegate)方法。

我觉得这些是相关的,并且还与它们失败的方法被定义为 Objective-C 类的类别这一事实有关。但这只是目前的猜测。

我已确保 RapidEars 框架已导入且位于框架搜索路径中。

谁能告诉我为什么会这样?或者如果我错过了一些 Swift 魔法咒语?

最佳答案

问题可能出在下面的链接中,其中静态库中的类别方法会产生selector not recognized 运行时错误。

Technical Q&A QA1490: Building Objective-C static libraries with categories

关于ios - 在 XCode 7 中导入带有类别扩展的接口(interface)时编译和运行时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37175284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com