2016-02-07 2 views
-1

У меня есть следующиеДелегат свойство, которые инициированы на соответствующий класс

protocol SentenceDelegate: class{ 
    func sentenceDidFinish() 
} 

У меня есть SentenceMarkov класс соответствовать протоколу:

class SentenceMarkov : SentenceDelegate{ 
    // foo 
    // bar 
} 

я реализовать метод протокола в моем классе конформного :

class SentenceMarkov : SentenceDelegate{ 
    //... 
    func sentenceDidFinish{ 
     //Do something 
    } 
    //... 
} 

Я создаю объект недвижимости класса что вызывает метод протокола под названием sentenceDelegate:

class otherClass{ 
    //.. 
    weak var sentenceDelegate: SentenceDelegate? 
    //.. 
} 

Я установить это свойство в моем первом классе self

class SentenceMarkov{ 
var FirstOne:OtherClass { 
    didSet { FirstOne.sentenceDelegate = self} 
} 
var SecondOne:OtherClass { 
    didSet{ SecondOne.sentenceDelegate = self} 
} 

init(Ult:OtherClass, Penult:OtherClass){ 
    self.FirstOne= Ult 
    self.SecondOne = Penult 
    self.FirstOne.sentenceDelegate = self 
    self.SecondOne.sentenceDelegate = self 
} 
//.. 
} 

Наконец я вызываю метод sentenceDelegate в OtherClass после init()

class OtherClass{ 
    func sentenceDone(){ 
     sentenceDelegate?.sentenceDidFinish() 
    } 
} 

Проблема заключается в том, что когда я устанавливаю точки останова по указанному выше методу, sentenceDelegate равен nil. Я не уверен, почему, потому что я установил его, хотя я мог бы ошибаться, но я не уверен, как это улучшить. Вот три Swift файлы включают ViewController где SentenceMarkov инициализируется:

https://gist.github.com/ebbnormal/e1cb791dd165a6866e11 https://gist.github.com/ebbnormal/263c9343e403c3a7ac40 https://gist.github.com/ebbnormal/1400e7da024d78ba5ed0

+1

Вы убедитесь, что sentenceDone вызывается из 'FirstOne 'или' SecondOne'? –

+0

@ Vishnugondlekar да, потому что я установил там точку останова и называется. – Thalatta

ответ

1

следующие работы для меня:

protocol Greeter: class { 
    func greet() 
} 

class Dog { 
    weak var greeter: Greeter? 
} 

class DogPound: Greeter { 

    func greet() { 
     print("Hi. Welcome to the DogPound!") 
    } 

    var dog: Dog { 
     didSet { 
      dog.greeter = self 
     } 
    } 

    init(dog: Dog) { 
     self.dog = dog 
     self.dog.greeter = self 
    } 

} 

let myDog = Dog() 
myDog.greeter?.greet() //=>nil 

DogPound(dog: myDog) 
myDog.greeter?.greet() 

--output:-- 
Hi. Welcome to the DogPound! 
+0

Спасибо, но я не вижу, как это отличается от того, что я делаю в своем коде (в основе). Я создаю объект «SentenceMarkov» (DogPound), который устанавливает 'предложениеDelegate' в' didSet' на двух принадлежащих ему «Setences» или (Dogs), инициализирует два «предложения» перед добавлением их в 'init' как вы это сделали. Пожалуйста, скажите мне разницу. – Thalatta

Смежные вопросы