如何用字符串匹配简写语法查找前缀为square且后缀为数字的子节点?
SpriteKit 子节点名称匹配:开头为square且结尾为数字的简写语法
你写的@%square语法是错误的,SpriteKit的enumerateChildNodes(withName:)方法不支持这种Objective-C字符串格式化风格的写法,它用的是glob通配符或正则表达式前缀的简写语法来实现名称匹配。
下面是两种满足你需求的正确写法:
1. Glob通配符(简单场景)
如果你的节点名称严格是square后直接跟数字(允许多位数字),可以用glob模式快速匹配:
self.enumerateChildNodes(withName: "square[0-9]*") { node, stop in // 处理匹配到的节点 }
[0-9]匹配单个数字字符*匹配后续任意数量的字符(用来兼容多位数字的情况)
注意:这个写法会匹配类似square123的节点,但如果存在square1abc这种名称的节点也会被匹配到,适合不需要严格结尾验证的场景。
2. 正则表达式简写(精确匹配)
如果需要严格匹配以square开头、结尾必须是数字的节点,推荐用带regex:前缀的正则表达式语法,这是最精确的方式:
self.enumerateChildNodes(withName: "regex:^square\\d+$") { node, stop in // 处理匹配到的节点 }
正则规则解释:
^匹配字符串的开头square固定匹配前缀文本\\d+匹配一个或多个数字(\\d代表数字,+表示至少出现一次)$匹配字符串的结尾
这种写法只会匹配square1、square123这类符合规则的节点,像square、squareabc、square1abc都会被排除。
完整示例代码
let someSquare = SKShapeNode() someSquare.name = "square1" let someOtherSquare = SKShapeNode() someOtherSquare.name = "square2" let nonMatchNode = SKShapeNode() nonMatchNode.name = "squareabc" self.addChild(someSquare) self.addChild(someOtherSquare) self.addChild(nonMatchNode) // 精确匹配符合规则的节点 self.enumerateChildNodes(withName: "regex:^square\\d+$") { node, stop in print("匹配到节点:\(node.name ?? "")") // 输出结果:square1、square2 }
内容的提问来源于stack exchange,提问作者quickj
相关产品推荐
相关产品推荐

