我需要一些关于在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中使用专用方法可以更清晰。
评论
答案 0 :(得分:1)
您的问题并非真正针对特定语言。您需要决定何时应该调用委托。在Objective-C代码中,您添加了updateStudents
方法。但出于某种原因,您在Swift代码中采用了完全不同的方法。为什么呢?
在任何一种语言中,您都可以选择将students
属性设置为完全公开,完全私有,或公开只读,并可私下设置。当然,Swift增加了其他级别的可见性,但这与此讨论无关。
在任何一种语言中,您都可以选择使用其他方法(例如updateStudents
)或在属性的设置器中调用代理(同样,Swift为此添加更精细的选项,但这不是这里很重要。)
所以你问题的基础是有缺陷的。它不是特定于语言的。首先决定何时调用委托。是在students
属性更新的时候还是在调用其他方法的时候?
如果您希望Swift代码与Objective-C代码(具有相同的语义)一样工作,则不希望在属性的didSet
中调用委托。您想要添加updateStudents
方法。并确保您使students
属性在两种语言中都具有相同的可见性。