我有以下的类,它遵循的协议SentenceDelegate
Delgator的委托财产分两个委托者,而不是Delegate类
class SentenceMarkov : SentenceDelegate{
var UltimateSentence : Sentence {
didSet { UltimateSentence.sentenceDelegate = self}
}
var PenultimateSentence : Sentence
init(Ult : Sentence, Penult : Sentence){
self.UltimateSentence = Ult
self.PenultimateSentence = Penult
}
func startChain(){
self.PenultimateSentence.sentenceDelegate = self
self.PenultimateSentence.start()
}
func sentenceDidFinish(){
self.nextSentence(self.UltimateSentence.type, penUltType: self.PenultimateSentence.type)
}
//etc.
}
我定义SentenceDelegate
如下:
protocol SentenceDelegate: class{
func sentenceDidFinish()
}
最后,我的委托人类别Sentence
定义如下:
class Sentence : NSObject {
var type=""
var eventArray:[SoundEvent] = []
weak var sentenceDelegate: SentenceDelegate?
weak var soundEventDelegate: SoundEventDelegate? = nil {
didSet {
eventArray.forEach() {$0.delegate = soundEventDelegate}
}
}
init(type :String){
//etc.
}
func sentenceDone(){
sentenceDelegate?.sentenceDidFinish() //This is where the program breaks
}
func start(){
self.playEvent(0)
}
func handleTimer(timer: NSTimer) {
guard let index = timer.userInfo as? Int else { return }
playEvent(index)
}
func playEvent(eventIndex : Int){
if (eventIndex < 2){
let currEvent = self.eventArray[eventIndex]
currEvent.startEvent()
let nextIndex = eventIndex + 1
SharingManager.sharedInstance.globalTimer = NSTimer.scheduledTimerWithTimeInterval(currEvent.duration, target: self, selector: Selector("handleTimer:"), userInfo: NSNumber(integer: nextIndex), repeats: false)
}
else if (eventIndex==2){
let currEvent = self.eventArray[eventIndex]
currEvent.startEvent()
SharingManager.sharedInstance.globalTimer = NSTimer.scheduledTimerWithTimeInterval(currEvent.duration, target: self, selector: Selector("sentenceDone"), userInfo: nil, repeats: false)
}
else{
//Nothing
}
}
}
我初始化上面上课,从我ViewController
用以下方式启动程序:
let s1:Sentence = Sentence(type: "S3")
let s2:Sentence = Sentence(type: "S1")
var newModel = SentenceMarkov(Ult: s1, Penult: s2)
newModel.startChain()
当我运行它,它不会对委托类执行SentenceDelegate
方法sentenceDidFinish
。当我为该方法设置一个中断点时,程序不会停止。当我在Delegator类中的sentenceDone
上设置断点时,我检查self
变量,并看到sentenceDelegate
已定义,但指向Delegator类的两个副本(UltimateSentence
和PenultimateSentence
),而不是Delegate类。此外,Delegator类的这两个实例在使用断点检查时具有sentenceDelegate
属性nil
。
赋予与照片:
我不明白是怎么Sentence
财产sentenceDelegate
(其中他的一套以self
在SentenceMarkov)指向一个句子,而不是委托类请致电sentenceDidFinish
。任何澄清我的推理/编程错误将不胜感激。
问题,如果我还需要设置'penultimateSentence'的委托,该怎么办。我应该创建另一种特定的方法吗? – Thalatta
并且像你一样调用'init()'? – Thalatta
是的,绝对是从'init'打电话给他们的。 – Michael