我正在重构UIViewController来删除不应在其中的非UI内容。我一直在观察Andy Matuschak's great talk about this,在一个示例中,他正在扩展NSPredicate并移动逻辑,以将谓词从视图控制器移入其中,并在其中设置结果的fetchRequest.predicate

我正在尝试做同样的事情,但是在扩展程序的便捷初始化中出现错误:

import Foundation

extension NSPredicate {
    convenience init(forLiftLogFilter) { // it doesn't like this line
        if let logFilter = UserDefaultsManager.sharedInstance.logFilter?.rawValue {
            filterPredicate = NSPredicate(format: "lift.liftName = [c] %@", logFilter)
        } else {
            filterPredicate = nil
        }
    }
}


我将通过“ UIViewController”调用它,如下所示:

  override func viewWillAppear(animated: Bool) {
        let filterPredicate = NSPredicate.forLiftLogFilter // thinks NSPredicate doesn't have a member named 'forLiftLogFilter'
        reloadData(filterPredicate)

    super.viewWillAppear(animated)
  }


就我而言,我不需要传递任何初始化参数,但是我很确定我需要一个外部名称forLiftLogFilter以便进行调用。 Xcode(8.0 / Swift 2.3)告诉我'未命名的参数必须用空名称'_'编写。我理解该错误,但实际上没有任何参数。必须认为forLiftLogFilter是参数或其他内容。当然,由于这不起作用,在我拨打电话的UIViewController中,我告诉我'Type NSPredicate没有成员'forLiftLogFilter'。

我做了很多有关扩展,初始化程序等的阅读,但没有关于带有名称但没有参数的便捷初始化程序的答案。

谁能帮助我了解初始化程序有什么问题?

为了进行比较,下面是安迪在演示中使用的代码:

extension NSPredicate {
    convenience init(forTasksWithinNumberOfDays numberOfDays: Int, ofDate: Date, calendar: NSCalendar = NSCalendar.currentCalendar()) {
    self.init(format: "dueDate = %@" argumentArray: [calendar.dateByAddingUnit(.day, value: numberOfDays, toDate: date, options: NSCalendarOptions())!]
  }
}


他像这样从视图控制器中调用它:

override func viewDidLoad() {
    super.viewDidLoad()

    fetchRequest.predicate = NSPredicate(forTasksWithinNumberOfDays: 10, ofDate: NSDate())


我添加了此内容以显示我认为需要遵循的结构...

最佳答案

听起来您正在尝试创建一个返回NSPredicate实例的类方法。

您的扩展程序必须是这样的:

import Foundation

extension NSPredicate {
    static func forLiftLogFilter() -> NSPredicate? {
        if let logFilter = UserDefaultsManager.sharedInstance.logFilter?.rawValue {
            return NSPredicate(format: "lift.liftName = [c] %@", logFilter)
        } else {
            return nil
        }
    }
}


现在,您可以正确地调用此类方法:

let filterPredicate = NSPredicate.forLiftLogFilter

10-04 23:33
查看更多