Swift:在didSet中通知委托?

时间:2017-11-08 02:09:42

标签: objective-c swift delegates

我需要一些关于在Swift中通知委托的最佳做法的帮助,我有一个Student模型,其中包含Student列表,每个Student都有一个得分,模型提供它所指的所有class ScoreStats { private(set) var averageScore: Double = 0 var student: [Student]? { if let students = students { // calculate `averageScore` } // notify delegate self.delegate.averageScoreUpdated() } } 的平均分数:

- (void)updateStudents:(NSArray<Student *> *)students {
  self.students = students;
  // calculate `averageScore`
  [self.delegate averageScoreUpdated];
}

我的问题是,来自Objective C,人们通常会采用以下方法:

didSet

从特定语言的角度来看,我可以使用students达到同样的目的但是在其他方面有任何问题吗?例如,在Swift中公开students属性意味着不同的地方都可以修改它并且会通知委托,编码器也不清楚设置averageScore属性是否会触发{model的委托通知1}},而在ObjC中使用专用方法可以更清晰。

评论

1 个答案:

答案 0 :(得分:1)

您的问题并非真正针对特定语言。您需要决定何时应该调用委托。在Objective-C代码中,您添加了updateStudents方法。但出于某种原因,您在Swift代码中采用了完全不同的方法。为什么呢?

在任何一种语言中,您都可以选择将students属性设置为完全公开,完全私有,或公开只读,并可私下设置。当然,Swift增加了其他级别的可见性,但这与此讨论无关。

在任何一种语言中,您都可以选择使用其他方法(例如updateStudents)或在属性的设置器中调用代理(同样,Swift为此添加更精细的选项,但这不是这里很重要。)

所以你问题的基础是有缺陷的。它不是特定于语言的。首先决定何时调用委托。是在students属性更新的时候还是在调用其他方法的时候?

如果您希望Swift代码与Objective-C代码(具有相同的语义)一样工作,则不希望在属性的didSet中调用委托。您想要添加updateStudents方法。并确保您使students属性在两种语言中都具有相同的可见性。