我正在重构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