在我的Swift代码中,我有一些看起来像这样的方法:
protocol EditorDelegate {
// ...
func didStartSearch(query: String) -> Bool
}
class Editor: UIViewController {
func search(sender: AnyObject) {
let wasHandled = self.delegate?.didStartSearch(query) ?? false
if !wasHandled {
// do default searching behavior
}
}
}
这有效,但不是自我记录。 didStartSearch
方法并没有真正传达它返回一个标志,指示是否应该跳过默认行为。
处理此问题有哪些好的选择?
答案 0 :(得分:2)
我试着想出一个更好的方法来命名委托功能,下面是我想出的对我来说最有意义的东西。枚举在swift中非常强大,使用它们可以使代码更容易理解。此外,我喜欢用不同的状态来思考问题,这些状态可以用枚举清楚地定义。
enum SearchStatus {
case Ready
case Processing
case Complete(result: String)
}
protocol EditorDelegate: class {
func statusForSearch(with query: String) -> SearchStatus
}
class Editor: UIViewController {
weak var delegate: EditorDelegate?
func search(sender: AnyObject) {
let query = "some input.."
guard let status = delegate?.statusForSearch(with: query) else {
// delegate not set
return
}
switch status {
case .Ready:
// actually do your search
break
case .Processing:
// search in progress
break
case .Complete(let result):
// do something with result
print("result = \(result)")
break
}
}
}
答案 1 :(得分:1)
考虑委托对象与被委托的对象之间的关系,以及"消息" (在高级语义中,而不仅仅是代码),委托方法的调用是关于。也就是说,委托方法调用是否意味着,"嘿,如果您感兴趣,这件事就发生了,"或者,"这件事发生了,我该怎么办呢?"。如果委托向委托对象返回值,则可能属于第二类。
Per Coding Guidelines for Cocoa,委托方法应该:
首先确定委派对象(例如tableView:didSelectRow:
中的tableView或windowWillClose:
中的窗口)。这很重要,因为委托可以是多对一的关系 - 如果你在一个类上有delegate
属性(或setDelegate
方法),那么就没有什么能阻止一个对象成为许多其他人的代表,对于那些采用你的代表协议的人来说,这确实是一个有用的模式。
如果方法询问委托的某些内容,要么为要求的内容命名(例如cellForRowAtIndexPath
),要么为布尔条件,描述正值的后果 - 这通常涉及像&#这样的语言34;应该" (例如windowShouldClose
,tableView:shouldSelectRowAtIndexPath:
)。
在你的情况下,并不完全清楚"应该"由于代理人返回true
或false
而发生,但这是猜测:
protocol EditorDelegate {
func editor(_ editor: Editor, shouldShowDefaultResultsForSearch query: String) -> Bool
}
答案 2 :(得分:0)
由于许多原因,返回标志的使用通常被认为是有问题的。有关支持和反对的论据的许多解释之一,请参阅this link。然而,在这种情况下可能有用的一个解决方案是使用typealias
。
typealias useDefaultBehaviour = Bool
protocol EditorDelegate {
func didStartSearch(query: String) -> useDefaultBehaviour
}