Xcode 6.3 和 Swift 1.2 中的新警告:从“[SKNode]”转换为无关类型 'String' 总是失败
New warning in Xcode 6.3 & Swift 1.2: Cast from '[SKNode]' to unrelated type 'String' always fails
更新到 xCode 6.3 / Swift 1.2 后,我 运行 遇到无法解决的错误:"Cast from '[SKNode]' to unrelated type 'String' always fails".
下面是我的 GameScene 代码,它首先解析一个 p-list。
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,这会引发更多错误。
这里:
var levelDict:AnyObject = levelNSArray[level]
您将 levelDict
声明为 AnyObject
,但此处:
if let tmxFile = levelDict["TMXFile"] as? String {
你把它当作一本字典来使用 - 我想知道它怎么可能在以前的 Xcode 版本中工作...
但是,要修复它,请将该变量设为显式字典,或者 cocoa 字典:
var levelDict = levelNSArray[level] as? NSDictionary
if let tmxFile = levelDict?.objectForKey("TMXFile") as? String {
或 swift 一个:
var levelDict = levelNSArray[level] as? [String : AnyObject]
if let tmxFile = levelDict?["TMXFile"] as? String {
如果您碰巧在 case 语句中使用对象的 dynamicType 执行此操作,方法如下:
switch (self.dynamicType) {
case is MyClass.Type:
print("MyClass")
break;
}
更新到 xCode 6.3 / Swift 1.2 后,我 运行 遇到无法解决的错误:"Cast from '[SKNode]' to unrelated type 'String' always fails".
下面是我的 GameScene 代码,它首先解析一个 p-list。
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,这会引发更多错误。
这里:
var levelDict:AnyObject = levelNSArray[level]
您将 levelDict
声明为 AnyObject
,但此处:
if let tmxFile = levelDict["TMXFile"] as? String {
你把它当作一本字典来使用 - 我想知道它怎么可能在以前的 Xcode 版本中工作...
但是,要修复它,请将该变量设为显式字典,或者 cocoa 字典:
var levelDict = levelNSArray[level] as? NSDictionary
if let tmxFile = levelDict?.objectForKey("TMXFile") as? String {
或 swift 一个:
var levelDict = levelNSArray[level] as? [String : AnyObject]
if let tmxFile = levelDict?["TMXFile"] as? String {
如果您碰巧在 case 语句中使用对象的 dynamicType 执行此操作,方法如下:
switch (self.dynamicType) {
case is MyClass.Type:
print("MyClass")
break;
}