2016-09-30 5 views
0

私はUIViewControllerをリファクタリングして、そこにはないはずのUI以外のものを削除します。私はAndy Matuschak's great talk about thisを見ており、一例では、彼はNSPredicateを拡張しており、述語がビューコントローラからのものでなければならない動くロジックを動かし、fetchRequest.predicateに結果を設定します。私の便利なinitは内線では機能しません

私は同じことをやろうとしているが、私は私の拡張機能の利便性のinitのエラーを取得しています:

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では、 'タイプ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()) 

私はショーにこれを追加しましたどのような構造の私は私に従う必要があると思う...

答えて

0

あなたはインスタンスを返すクラスメソッドを作成しようとしているようですNSPredicate

あなたの拡張機能は、このようなものにする必要があります:あなたはコンビニエンス初期化子を必要としない

let filterPredicate = NSPredicate.forLiftLogFilter 
+0

@rmaddyこんにちは、私は再びそれは私がやろうとしているものだと思うが、していない、私は一種のよ初心者なので、私が何を話しているのか必ずしも分かりません。私は近似しようとしているコードの例を追加しました。多分それはそれをクリアするでしょう。 'self.init()'はおそらく違いがありますか? – Jim

+0

また、Andy氏は、その拡張子を示すとコメントします。「私は同じように簡単に工場種別を作ることができます。それはあなたが提案したものに似ていますか? – Jim

+0

他の 'init'メソッドと区別するために' init'メソッドに渡すパラメータがないので、同じ方法を使用することはできません。 – rmaddy

0

:今、あなたは正しくこのクラスのメソッドを呼び出すことができます

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 
     } 
    } 
} 

あなたがそれを必要なときだけ

var filterPredicate: NSPredicate = nil 
    if let logFilter = UserDefaultsManager.sharedInstance.logFilter?.rawValue { 
      filterPredicate = NSPredicate(format: "lift.liftName = [c] %@", logFilter) 
    } 

を呼び出します。

それとも、クラススコープでの使用のためにそれをしたい場合:

private lazy var filterPredicate: NSPredicate = { 
    if let logFilter = UserDefaultsManager.sharedInstance.logFilter?.rawValue { 
     return NSPredicate(format: "lift.liftName = [c] %@", logFilter) 
    } 
    return nil 
} 
+0

'forLiftLogFilter'という名前のクラスがないので、これは動作しません。これは、OPがこのメソッドに使用したかった名前です。 – rmaddy

+0

便利なinitメソッドは、指定されたinitを呼び出さなければならないことにも注意してください。この実装はそれをしません。 – rmaddy

+0

あなたの編集はまだ有効ではありません。 OPは拡張機能のこの 'init'に渡す必要のあるものはまったく持っていません。 – rmaddy

関連する問題