Xcode 6.3中的新警告& Swift 1.2:来自' [SKNode]'到不相关的类型' String'总是失败

时间:2015-04-14 16:35:03

标签: swift casting sprite-kit plist xcode6.3

更新到xCode 6.3 / Swift 1.2后,我遇到了一个我无法解决的错误:“从'[SKNode]'转换为无关类型'String'总是失败”。

下面是我的GameScene代码,它首先解析一个p列表。

import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate, NSXMLParserDelegate {

    var currentTMXFile:String?

    override func didMoveToView(view: SKView) {

        /* Parse p-list */

        let path = NSBundle.mainBundle().pathForResource("GameData", ofType: "plist")
        let dict = NSDictionary(contentsOfFile: path!)!
        let playerDict:AnyObject = dict.objectForKey("PlayerSettings")!
        let gameDict:AnyObject = dict.objectForKey("GameSettings")!
        let levelArray:AnyObject = dict.objectForKey("LevelSettings")!

        if let levelNSArray:NSArray = levelArray as? NSArray {

            var levelDict:AnyObject = levelNSArray[level]

            numberOfLevels = levelNSArray.count

            if let tmxFile = levelDict["TMXFile"] as? String {

                currentTMXFile = tmxFile

            }

        }

错误正在......

if let tmxFile = levelDict["TMXFile"] as? String {...

并返回一个nil值,即使p-list中有一个字符串值,在更新之前,它仍然正常工作。我已经尝试先将其作为AnyObject进行投射,这会引发更多错误。

2 个答案:

答案 0 :(得分:4)

下面:

var levelDict:AnyObject = levelNSArray[level]

您将levelDict声明为AnyObject,但在此处:

if let tmxFile = levelDict["TMXFile"] as? String {

你正在使用它就好像它是一本字典 - 我想知道它在以前版本的Xcode中是如何工作的......

但是,要修复它,请将该变量设为显式字典,或者是cocoa one:

var levelDict = levelNSArray[level] as? NSDictionary

if let tmxFile = levelDict?.objectForKey("TMXFile") as? String {

或快速的:

var levelDict = levelNSArray[level] as? [String : AnyObject]

if let tmxFile = levelDict?["TMXFile"] as? String {

答案 1 :(得分:1)

如果您碰巧使用case语句中的对象的dynamicType执行此操作,请按以下步骤操作:

     switch (self.dynamicType) {
        case is MyClass.Type:
            print("MyClass")
            break;
     }