我的班级有一个属性
var activeSquares = Dictionary <String, SKShapeNode> ()
我尝试使用
在字典中添加和更新值let squareNode = SKShapeNode(rectOfSize: CGSizeMake(80, 80), cornerRadius: 8)
activeSquares.updateValue(squareNode, forKey: "someUniqueDescription")
如果我使用
,我也会遇到同样的崩溃activeSquares["someUniqueDescription"] = squareNode
但它在编译时会导致崩溃
1. While emitting IR SIL function @_TFC14gamename9GameScene11addedSquarefS0_FCS_6SquareT_ for 'addedSquare' at /.../gamename/gamename/GameScene.swift:30:5
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)
Command /Applications/Xcode6-Beta2.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254
如何正确使用updateValue向我的字典添加/更新键/值对?
答案 0 :(得分:0)
不确定我的解决方案是否适用于此,但它可能有所帮助。似乎有一些奇怪的订阅NSDictionary。不知道为什么,但它被定义为:
func objectForKeyedSubscript(key: NSCopying!) -> AnyObject!
所以,如果我没有错,它会隐式返回unwrapped可选项,但应该返回可选项,只要键没有值。如果你试着写:
if(dictionary["key"] != nil)
如果你写的话,你会得到编译错误“AnyObject不能转换为UInt8”:
if(dictionary["key"])
你没有得到一个。
我解决这个问题的方法是使用可选的解包,所以:
if(someBool && dictionary["key"]) // fine in beta 2, crash in beta 3-4
// turned to:
var hasValueForKey = false
if dictionary["key"]
{
hasValueForKey = true
}
if(someBool && hasValueForKey) // fine in beta 4
和
var someArray : NSArray? = dictionary["key"]? as? NSArray // note ? after []
我想可能会有一些选项和用于通过下标设置对象的东西,它被定义为:
func setObject(obj: AnyObject!, forKeyedSubscript key: NSCopying!)
也许玩可选的展开也可以帮到这里。