2016-02-24 68 views
0

我需要在for-in循環內遍歷SKNode.children,我需要通過訪問我的類的屬性來檢查條件是真還是假,通過node。我想我需要將node作爲我班的一個對象,以便能夠通過在Swift中使用isKindOfClass方法訪問類型爲bool的屬性。這是Objective-C的代碼。任何想法如何在Swift中做同樣的事情?如何在for-in循環中使用isKindOfClass訪問我的類的屬性?

-(BOOL)isCompleted() { 
    for(SKNode *node in mainLayer.children) { 
     if([node isKindOfClass:[Laser class]]) { 
      if(!((Laser*)node).indestructible) { 
       return NO 
      } 
     } 
    } 
    return YES 
} 

回答

3

一個相當直接翻譯:

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 
    } 
+0

我覺得'return(mainLayer.children.filter {$ 0是Laser} as! [激光])。包含{!$ 0.indestructible}'可能更具可讀性,但顯然這是主觀的 –

+0

你也可以做'children.flatMap {$ 0 as?激光}'以避免演員陣容。 –

+1

我認爲在第一個例子中'as'應該是'as?',而第二個例子中的邏輯不正確。如果您將第二個示例更改爲'return!(mainLayer.children.contains {!(($ 0 as?Laser)?. indestructible ?? true)})',則結果與第一個示例相同。 – Epsilon

相關問題