使用变量创建NSPredicate

时间:2015-01-13 19:39:40

标签: ios arrays swift core-data nspredicate

我正在使用Core Data存储由多个实体组成的对象模型,但相关的是:

实体: 拉伸

相关属性:
equipmentUsed, muscleGroup

我在故事板中有一个带有UISegmentedControl的场景,我用它来选择equipmentUsed

// Creates a variable which changes the selectedEquipment type based on which 
// selectedSegmentIndex is clicked

    var stretches: [Stretch] = [] // List of stretches
    var selectedEquipment : NSString? // Equipment selected from UISegmentedControl

    @IBAction func selectEquipment(sender: UISegmentedControl) {
        if equipmentSelector.selectedSegmentIndex == 0 {
            self.selectedEquipment = "roller"
        }
        if equipmentSelector.selectedSegmentIndex == 1 {
            self.selectedEquipment = "none"
        }
    }

UISegmentedControl下方,我使用静态细胞来切换各种肌肉群。使用谓词进行过滤的每个示例都会转储TableView上的所有数据,然后进行过滤。我正在尝试为谓词选择关键路径并将它们放在一个数组中。

我正在尝试创建选择特定设备(例如:无或泡沫滚轴)和特定肌肉群的谓词。我使用前面的selectedEquipment字符串作为下面谓词中的变量:

var shoulderPredicate = NSPredicate(format: "stretch.equipmentUsed contains[c] $selectedEquipment AND (stretch.muscleGroup contains[c] %@", "shoulders")

我在使用shoulderPredicate创建数组时遇到了麻烦。这是我创建数组的代码:

@IBAction func testSearchStretches(sender: AnyObject) {
    println("testSearchStretches clicked")
    var stretchList = (stretches as NSArray).filteredArrayUsingPredicate(shouldersPredicate)
    for stretch in stretchList {
        println(stretch)
    }
}

我可以看到testSearchStretches IBAction在控制台中打印出“testStretches clicked”,但它不会打印stretchList,但我知道有一个与谓词匹配的Stretch。我相信我设置的谓词不区分大小写,所以我认为这不是问题所在。

一旦我弄清楚阵列,我将在另一个屏幕上显示结果。现在,我只是想让谓词工作来创建stretchList数组。我是编程的新手,我正试图超越教程来自己创建一些东西。如果你来到这里,感谢阅读,我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

谓词有两个问题:

  • 您不得在密钥路径中包含实体名称。
  • 谓词格式字符串中的
  • $selectedEquipment不插入或插入 selectedEquipment变量的值。可以使用谓词中的$VAR 使用predicateWithSubstitutionVariables()函数,但我认为是 不是你想要的。

您的谓词应该是

NSPredicate(format: "equipmentUsed contains[c] %@ AND muscleGroup contains[c] %@",
     selectedEquipment, "shoulders")

假设“equipmentUsed”和“muscleGroup”是 String 属性。