【问题标题】:unable to create Singleton object for my class无法为我的班级创建单例对象
【发布时间】:2018-01-31 14:39:42
【问题描述】:

我正在为 Text2Speech 创建一个类,为此,我正在创建一个 Singleton 对象以在我的项目的许多地方将其用作单个对象,但出现以下错误:

我的代码:

static let sharedInstance = Text2Speech()

或者

static let sharedInstance : Text2Speech = {
    let instance = Text2Speech()
    return instance
}()

我遇到的错误:

不能在属性初始化器中使用实例成员“Text2Speech”; 属性初始化器在“self”可用之前运行

我在很多地方都在为 SingleTon 对象做同样的声明,但只有在这个类中,我得到了上述错误。

我已经检查了this question thread,但没有找到任何解决方案。

那堂课里有些东西连线或弄乱了。

编辑:

Text2Speech 类:

class Text2Speech: NSObject, AVSpeechSynthesizerDelegate {
    var delegate: Text2SpeechDelegate?
    var utteranceCount : Int
    var isMale : Bool
    let synth = AVSpeechSynthesizer()
    static let sharedInstance = Text2Speech()
    
//    static let sharedInstance : Text2Speech = {
//        let instance = Text2Speech()
//        return instance
//    }()
    
    override init() {
        self.utteranceCount = 0;
        self.isMale = false
        super.init()
        synth.delegate = self
    }
    
    func Text2Speech(_ text: String){
        utteranceCount += 1
        let myUtterance = AVSpeechUtterance(string: text)
        myUtterance.postUtteranceDelay = 0.005
        myUtterance.rate = 0.5
        myUtterance.pitchMultiplier = 1.0
        if self.isMale{
            myUtterance.voice = AVSpeechSynthesisVoice(language:"en-GB")
        }
        synth.speak(myUtterance)
    }
    
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) {
        delegate?.Text2SpeechConvertor(synthesizer, didStart: utterance)
    }
    
    func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) {
        utteranceCount -= 1
        let seriouslyFinished = utteranceCount==0 ? true:false
        delegate?.Text2SpeechConvertor(synthesizer, didFinish: utterance, seriouslyFinished: seriouslyFinished)
    }
}

谁能帮我解决这个问题?

提前致谢。

【问题讨论】:

  • 需要更多上下文。 class Text2Speech { static let sharedInstance = Text2Speech() } 编译没有问题。
  • @MartinR 我已经添加了整个 Text2Speech 类,您可以查看我更新的答案吗?

标签: ios swift swift3 singleton


【解决方案1】:

问题是你有一个同名的函数 班级。这是一个最小的独立示例,演示了 问题:

class Text2Speech {
    static let sharedInstance = Text2Speech()
    // error: cannot use instance member 'Text2Speech' within property initializer; property initializers run before 'self' is available

    func Text2Speech(_ text: String) { }
}

显然,编译器将Text2Speech() 作为尝试 调用函数。重命名函数(例如改名为func text2Speech)可以解决问题。

请注意,Swift 约定是以 大写字母和带有小写字母的函数名。

【讨论】:

  • 是的@Martin,你是对的,它的函数名与类名相同的问题。现在它的工作我已将其更改为 func text2Speech 并且它现在工作,感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多