字典updateValue导致swift编译器分段错误

时间:2014-07-07 17:43:26

标签: swift xcode6

我的班级有一个属性

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向我的字典添加/更新键/值对?

1 个答案:

答案 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!)

也许玩可选的展开也可以帮到这里。