2016-11-24 16 views
0

私は非常に奇妙なことがあります。 私の簡単な関数では、設定パラメータの辞書を含む変数を作成します。それは 'let'として設定されているので、内部ループはただそれを読み込みます。 ループタイムのランダムな瞬間に、 "未解決の設定"でクラッシュします。 スムースのように見えないようです。それは誰ですか?スイフト3可変自己消化

private static func preferencesFilter(userIDs: [Int], access: String) -> [User] { 
    self.sharedInstance.delegate?.updateActionLabel(label: "Filter") 
    var result = [VKUser]() 
    let settings = self.parseSettings() 
    let progressFraction = 1.00/Float(userIDs.count) 
    var n = 0 
    for userID in userIDs { 
     if sharedInstance.stopped { 
      return [] 
     } 
     n += 1 
     let user = VKUser.getUser(id: userID, access_token: access_token) 
     if settings["gender"] != nil { 
      if user.sex == settings["gender"] as! String { 
       if (user.born?.isBetweeen(date1: settings["minAge"] as! Date, date2: settings["maxAge"] as! Date))! { 
        if settings["country"] != nil { 
         if user.country == settings["country"] as! String { 
          result.append(user) 
         } 
        } 
        else { 
         result.append(user) 
        } 
       } 
      } 
     } 
     else { 
      if (user.born?.isBetweeen(date1: settings["minAge"] as! Date, date2: settings["maxAge"] as! Date))! { 
       if settings["country"] != nil { 
        if user.country == settings["country"] as! String { 
         result.append(user) 
        } 
       } 
       else { 
        result.append(user) 
       } 
      } 
     } 
     self.sharedInstance.delegate?.updateProgress(value: Float(n) * progressFraction) 
    } 
    return result 
} 
+0

あなたは本当にかなり安全でないコードを書いたと思います。より安全なものにするために、 "if let"の組み合わせや "guard"を追加してみてください。何かを強制的にキャストしないようにしてください( "!"で)、プログラムが最終的にクラッシュします。 私はそれをより迅速かつ安全なものに書き直そうとしましたが、if-elseステートメントとスキップされたすべてのケースでも失われました。この方法があなたが望むことをしているかどうかを確認するために、単体テストを書いていますか?ユーザーを追加する、または追加しない組み合わせが数多くあります。 – Jelle

+0

@Jelleあなたの答えに感謝します!あなたは、この辞書で間違いが間違っていることを意味しますか?しかし、それが静的であればどうやって間違っているのでしょうか。それはちょうど私が正しく理解するようにメモリに読み込まれます。私はそれを動的に更新しません。それはsmth "ガベージコレクター"間違った仕事ですか?私が「警備員」をやるならば、それはエラーではなく、スクリプトは正しく動作していないということを意味します。 –

+0

私の言うことは、コードは読みにくく、実際の状況ではクラッシュする可能性があるということです。私はそれをもっと安定したものに書き直そうとします。 – Jelle

答えて

0

私はのようなものより迅速にコードをリファクタリング:

private static func preferencesFilter(userIDs: [Int], access_token: String) -> [User]? { 
    guard userIDs.count > 0 else { 
     return [User]() // no input, return empty list 
    } 
    let settings = self.parseSettings() 
    guard let minAge = settings["minAge"] as? Date, 
     let maxAge = settings["maxAge"] as? Date 
     else { 
      return nil 
    } 
    let country = settings["country"] as? String // specified or nil 
    let gender = settings["gender"] as? String  // specified or nil 

    sharedInstance.delegate?.updateActionLabel(label: "Filter") 
    var result = [VKUser]() 
    let progressFraction = 1.00/Float(userIDs.count) 
    var n = 0 
    for userID in userIDs { 
     if !sharedInstance.stopped { 
      n += 1 
      let user = VKUser.getUser(id: userID, access_token: access_token) 
      var shouldInclude = true 

      if user.sex != gender { // wrong sex or no required gender specified 
       shouldInclude = false 
      } 
      if user.country != country { // wrong country or no required country specified 
       shouldInclude = false 
      } 
      if let born = user.born { 
       if !born.isBetweeen(date1: minAge, date2: maxAge) { 
        shouldInclude = false 
       } 
      } else { // no user.born date, cant check if in range 
       shouldInclude = false 
      } 

      if shouldInclude { 
       result.append(user) 
      } 
      sharedInstance.delegate?.updateProgress(value: Float(n) * progressFraction) 
     } 
    } 
    return result 
} 

はあなたが書くために意図したものということですか?どのようにあなたのために実行されていますか? これを非静的メソッドに変更できますか?私にはもっと意味がある。 このメソッドは、nilで失敗する可能性があるので、これはオプションのnowを返します。あなたの呼び出しコードはそれを正しく処理する必要があります。

+0

それは動作します!実際、私はそれが本当に簡単で読みやすいと思っていますが、私の "汚い"版がクラッシュする理由は私には分かりません。ここでは、単にnilをチェックするだけです。それは、場合によっては、それが詰まっている可能性があり、それが起こったことを確認できないということですか?私たちはそれをほとんど解凍しないと、データが失われてしまいます。 –

+0

あなたのコードを解読するのに時間がかかったので、面白い隠されたエラーが含まれる可能性がありました。実際の問題を調べるためには、実際のコードを実行してそれをデバッグする必要があります。おそらく、デリゲートには現在解決されている副作用があります。多分何かが間違っていた。少なくともコードは読みやすく、理解しやすいので、エラーを見つけ出すのが簡単になるはずです。 このコードでは、nil(国、性別)とオプションの「生まれた」プロパティである場合に無視されるいくつかの実際のオプションがあります:いくつかの非選択肢(設定からのminAgeとmaxAge) – Jelle

+0

マイナー発言:minAgeとmaxAgeは「年齢」の値ではなく日付であるため、より良い名前に変更したいと思います。また、「生まれた」という名前は私が使用する名前ではありません。性別と性別がどちらも「性」である場合、性別と性別は読みやすくなります。 – Jelle

関連する問題