Objective c 如何在for-in循环中使用isKindOfClass访问类的属性?

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

我需要在in循环的
中迭代
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