Objective c 如何在for-in循环中使用isKindOfClass访问类的属性?
我需要在in循环的Objective c 如何在for-in循环中使用isKindOfClass访问类的属性?,objective-c,swift,sprite-kit,swift2,Objective C,Swift,Sprite Kit,Swift2,我需要在in循环的中迭代SKNode.children,我需要通过节点访问类的属性来检查条件是真是假。我想我需要将节点强制转换为类的对象,以便能够使用Swift中的isKindOfClass方法访问类型为bool的属性。这是Objective-C的代码。你知道如何在Swift中实现这一点吗 -(BOOL)isCompleted() { for(SKNode *node in mainLayer.children) { if([node isKindOfClass:[Las
中迭代SKNode.children
,我需要通过节点访问类的属性来检查条件是真是假。我想我需要将节点
强制转换为类的对象,以便能够使用Swift中的isKindOfClass
方法访问类型为bool
的属性。这是Objective-C的代码。你知道如何在Swift中实现这一点吗
-(BOOL)isCompleted() {
for(SKNode *node in mainLayer.children) {
if([node isKindOfClass:[Laser class]]) {
if(!((Laser*)node).indestructible) {
return NO
}
}
}
return YES
}
相当直接的翻译:
var isCompleted: Bool {
for node in mainLayer.children {
guard let laser = node as? Laser else { continue }
if !laser.indestructible {
return false
}
}
return true
}
更地道的说法是:
var isCompleted: Bool {
return !mainLayer.children.lazy.flatMap { $0 as? Laser }.contains { !$0.indestructible }
}
但是双重否定令人困惑,所以我可能会添加几个访问器来进一步澄清它,如下所示:
class Laser: SKNode {
var indestructible = false
final var destructible: Bool { return !indestructible }
}
class MyScene: SKScene {
var mainLayer = SKNode()
var isUncompleted: Bool {
return mainLayer.children.lazy.flatMap { $0 as? Laser }.contains { $0.destructible }
}
final var isCompleted: Bool { return !isUncompleted }
}
或者可能是这样:
var isCompleted: Bool {
return mainLayer.children.lazy.flatMap { $0 as? Laser }.filter { $0.destructible }.isEmpty
}
相当直接的翻译:
var isCompleted: Bool {
for node in mainLayer.children {
guard let laser = node as? Laser else { continue }
if !laser.indestructible {
return false
}
}
return true
}
更地道的说法是:
var isCompleted: Bool {
return !mainLayer.children.lazy.flatMap { $0 as? Laser }.contains { !$0.indestructible }
}
但是双重否定令人困惑,所以我可能会添加几个访问器来进一步澄清它,如下所示:
class Laser: SKNode {
var indestructible = false
final var destructible: Bool { return !indestructible }
}
class MyScene: SKScene {
var mainLayer = SKNode()
var isUncompleted: Bool {
return mainLayer.children.lazy.flatMap { $0 as? Laser }.contains { $0.destructible }
}
final var isCompleted: Bool { return !isUncompleted }
}
或者可能是这样:
var isCompleted: Bool {
return mainLayer.children.lazy.flatMap { $0 as? Laser }.filter { $0.destructible }.isEmpty
}
我认为return(mainLayer.children.filter{$0是Laser}as![Laser])包含{!$0.indextructible}
可能更可读,但显然这是主观的,你也可以做children.flatMap{$0是Laser}
避免演员阵容。我认为第一个例子中的as
应该是as?
,第二个例子中的逻辑是不正确的。如果将第二个示例更改为return!(mainLayer.children.contains{!($0 as?Laser)?.indexible?true)}
,结果与第一个示例相同。是的,我在公交车上的iPad上写下了答案,所以很难得到完美的语法。我现在把它修好了,在操场上检查了一下。现在做一个时间测试,找出哪一个是最快的。lolI想返回(mainLayer.children.filter{$0是Laser}as![Laser])。包含{!$0.indextructible}
可能更可读,但显然这是主观的,你也可以做children.flatMap{$0是Laser}
避免演员阵容。我认为第一个例子中的as
应该是as?
,第二个例子中的逻辑是不正确的。如果将第二个示例更改为return!(mainLayer.children.contains{!($0 as?Laser)?.indexible?true)}
,结果与第一个示例相同。是的,我在公交车上的iPad上写下了答案,所以很难得到完美的语法。我现在已经把它修好了,在操场上检查过了。现在做一个时间测试,找出哪一个是最快的lol