ios - NSExpression 子查询用法

标签 ios swift

Swift 3 引入了一个新的 NSExpresion输入 Subquery expression .我试图在 Playground 中使用它,但无法正常工作。

首先,我在 MyPlayground 的 Sources 文件夹中创建了一个类:

// example classes
public class Person {
  public let name: String
  public let birthYear: Int

  init(name pName: String, birthYear year : Int) {
    name = pName
    birthYear = year
  }
}

public class Parent: Person {
  public var children: [Person] = [Person]()
  override init(name pName: String, birthYear year : Int) {
    super.init(name: pName, birthYear: year)
  }
}

public class TestSubquery {
  // Method to get a Parent
  public class func getParent() -> Parent {
    let p = Parent(name: "Bob", birthYear: 1997)
    let c = Person(name: "Tonny", birthYear: 2010)
    p.children.append(c)
    return p
  }
}

在MyPlayground中,集合表达式被创建为e1(聚合表达式和格式化表达式都试过了,都是集合表达式,但后期失败了):

let p = TestSubquery.getParent()
print("\(p.children.count)") // 1
let e1 = NSExpression(forAggregate: p.children)
// let e1 = NSExpressoin(format: "%@", p.children)
print("e1: \(e1)")
//e1: {MyPlayground_Sources.Person}

然后创建一个子查询表达式作为 e2:

let e2 = NSExpression(forSubquery: e1, usingIteratorVariable: "x", predicate: "$x.birthYear > 0")
print("\(e2)")
// SUBQUERY({MyPlayground_Sources.Person}, $x, $x.birthYear > 0)

最后,当我尝试从表达式中获取结果时,发生了错误:

let expValue = e2.expressionValue(with: nil, context: nil)
// Error

错误信息如下:

*** NSForwarding: warning: object 0x6080000547f0 of class 'MyPlayground_Sources.Person' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[MyPlayground_Sources.Person expressionValueWithObject:context:]

看起来找不到键值对。我不确定构建子查询表达式有什么问题。

非常感谢任何帮助!

最佳答案

经过几天的挣扎,我想我找到了解决办法!

首先,集合中的类,例如数组中的Person,必须继承自NSObject

public class Person : NSObject {

其次,根据Apple的Developer documentation

enter image description here

也就是说,第三个参数应该是NSPredicate类型(即使StringAny?)。更新后的 e2 应该是这样的:

let predicate = NSPredicate(format: "$x.birthYear > 0")
let e2 = NSExpression(forSubquery: e1, usingIteratorVariable: "x", predicate: predicate)
let expValue = e2.expressionValue(with: nil, context: nil)

通过这些更改,子查询表达式就像魅力一样工作。

关于ios - NSExpression 子查询用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40091637/

相关文章:

ios - 在 Sprite Kit 中处理非常快速移动的物体

swift - 检查是否从 Swift 中的 UILocalNotification 启动

ios - 添加约束以使图像成为屏幕尺寸的 1/4

ios - 关于 "to-many"和谓词

ios - 没有 iCloud 的 UIDocumentBrowserViewController

swift - 为什么 Swift NIO 示例使用 HTTP/2 到 HTTP/1 协议(protocol)转换?

ios - UIButton 未在 swift 中调用操作函数

swift - 关闭键盘但还允许 iOS Swift 中的其他操作?

ios - pod install 后没有这样的文件或目录

ios - 当滚动方向为水平时,从左到右填充 UICollectionView