我应该如何命名一个返回“continue”标志的委托方法?

时间:2016-08-29 13:44:50

标签: swift delegates

在我的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方法并没有真正传达它返回一个标志,指示是否应该跳过默认行为。

处理此问题有哪些好的选择?

3 个答案:

答案 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,委托方法应该:

  1. 首先确定委派对象(例如tableView:didSelectRow:中的tableView或windowWillClose:中的窗口)。这很重要,因为委托可以是多对一的关系 - 如果你在一个类上有delegate属性(或setDelegate方法),那么就没有什么能阻止一个对象成为许多其他人的代表,对于那些采用你的代表协议的人来说,这确实是一个有用的模式。

  2. 如果方法询问委托的某些内容,要么为要求的内容命名(例如cellForRowAtIndexPath),要么为布尔条件,描述正值的后果 - 这通常涉及像&#这样的语言34;应该" (例如windowShouldClosetableView:shouldSelectRowAtIndexPath:)。

  3. 在你的情况下,并不完全清楚"应该"由于代理人返回truefalse而发生,但这是猜测:

    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
}