2016-10-04 20 views
0

私は述語にかなり新しいことを認めなければなりません。私はユーザーが記入し、この情報に基づいて、保存されたデータを検索し、関連する結果を返すという形式を持っています。これのコードは次のとおりです。NSCompoundPredicateが予期しない結果を示しています

let numberOfPlayers = numberOfPlayersPicked 
    let minTimeForPredicate = minTime 
    let maxTimeForPredicate = maxTime 
    let gameTime = "averageplaytime" 
    let minPlayers = "minplayers" 
    let maxPlayers = "maxplayers" 
    let minPlayersPredicate = NSPredicate(format: "%K <= %D", minPlayers, numberOfPlayers) 
    let maxPlayersPredicate = NSPredicate(format: "%K >= %D", maxPlayers, numberOfPlayers) 
    let minTimePredicate = NSPredicate(format: "%K >= %D", gameTime, minTimeForPredicate) 
    let maxTimePredicate = NSPredicate(format: "%K <= %D", gameTime, maxTimeForPredicate) 
    let andPredicate = NSCompoundPredicate.init(andPredicateWithSubpredicates: [minPlayersPredicate, maxPlayersPredicate, minTimePredicate, maxTimePredicate]) 

numberOfPlayersPicked、minTimeおよびmaxTimeは前の画面からのものです。私が誤った情報を返すと感じる例は、numberOfPlayersPicked = 1、minTime = 120、maxTime = 999(時間はセグメント化されたコントロールによって設定されます)です。取得されたデータには、minplayers = 1、maxplayers = 2、averageplaytime = 60があります。なぜこれを取得しているのか分かりませんが、明らかに何かを誤解しています。

編集:何か起こりそうなものが見つかるかどうかを確認するために、結果の負荷を表示しようとしました。

print(andPredicate) 
print(numberOfPlayers) 
print(minTimeForPredicate) 
print(maxTimeForPredicate) 
print(games[0]) 

minplayers <= 1 AND maxplayers >= 1 AND averageplaytime >= 0 AND averageplaytime <= 30 
1 
0 
30 
<NSManagedObject: 0x6100000a5640> (entity: GameInCollection; id: 0xd0000000003c0000 <x-coredata://31C3474F-7C40-4C47-AF2D-883A76F922C6/GameInCollection/p15> ; data: { 
averageplaytime = 150; 
barcode = ""; 
gametitle = "1 5 150"; 
maxplayers = 5; 
minplayers = 1; 
}) 

print statements

print results

答えて

0

あなたは、文字列ではなく整数としてこれらの属性を格納していますか? 実際の数値よりも文字列の値を比較すると、このような予期しない結果が生じることがあります。

+0

はいこれでした。コアデータの保存を変更して、代わりに整数を格納するようになりました。 – LukeNobleUK