gpt4 book ai didi

ios - NSExpression 子查询用法

转载 作者:行者123 更新时间:2023-11-28 08:25:40 27 4
gpt4 key购买 nike

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 aheadUnrecognized 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com