私は非常に奇妙なことがあります。 私の簡単な関数では、設定パラメータの辞書を含む変数を作成します。それは '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
}
あなたは本当にかなり安全でないコードを書いたと思います。より安全なものにするために、 "if let"の組み合わせや "guard"を追加してみてください。何かを強制的にキャストしないようにしてください( "!"で)、プログラムが最終的にクラッシュします。 私はそれをより迅速かつ安全なものに書き直そうとしましたが、if-elseステートメントとスキップされたすべてのケースでも失われました。この方法があなたが望むことをしているかどうかを確認するために、単体テストを書いていますか?ユーザーを追加する、または追加しない組み合わせが数多くあります。 – Jelle
@Jelleあなたの答えに感謝します!あなたは、この辞書で間違いが間違っていることを意味しますか?しかし、それが静的であればどうやって間違っているのでしょうか。それはちょうど私が正しく理解するようにメモリに読み込まれます。私はそれを動的に更新しません。それはsmth "ガベージコレクター"間違った仕事ですか?私が「警備員」をやるならば、それはエラーではなく、スクリプトは正しく動作していないということを意味します。 –
私の言うことは、コードは読みにくく、実際の状況ではクラッシュする可能性があるということです。私はそれをもっと安定したものに書き直そうとします。 – Jelle