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,但这会引发更多错误。

4

2 回答 2

4

这里:

var levelDict:AnyObject = levelNSArray[level]

您声明levelDictAnyObject,但在这里:

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

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

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

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 {
于 2015-04-14T16:45:18.110 回答
1

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

     switch (self.dynamicType) {
        case is MyClass.Type:
            print("MyClass")
            break;
     }
于 2015-10-29T21:24:19.887 回答