2015-05-01 3 views
2

Так что я создал NSUserDefault хранить строку в моей GameViewControllerNSUserDefaults правильно хранения строк в SpriteKit Swift

NSUserDefaults.standardUserDefaults().setObject("_1", forKey: "SkinSuffix") 

Идея заключается в том, что хранит суффикс, который я придаю в конец имени изображения в порядке чтобы сохранить, какой скин персонажа должен использовать игрок.

Когда я звоню значение в моем классе GameScene как так

var SkinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix") 
println(SkinSuffix) 

печатает «факультативным (» _ 1 «)» вместо просто «_1» так что, когда я пытаюсь изменить имя моего файла изображения например, он не загружает файл изображения

hero = SKSpriteNode(texture: heroAtlas.textureNamed("10Xmini_wizard\(SkinSuffix)")) 

Как исправить эту проблему?

+0

Знаете ли вы, что такое опции в Swift? 'stringForKey()' возвращает 'String?' - знаете ли вы, что означает знак вопроса? –

+0

В основном это означает, что он может обрабатывать ответ, который делает/не существует (nil) правильно? И разворачивание в основном делает необязательным необязательным ... говоря, что оно должно иметь значение (не может быть nil). Верный? –

ответ

3

Вы можете развернуть Строка с использованием Дополнительная привязка. Это позволяет избежать сбоя приложения, если значение равно нулю.

if let skinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix") { 
    println(skinSuffix) 
} 

Update: Как правильно предположил в комментарии ниже, я ставлю полученные значения в постоянном (пусть). Мы всегда должны использовать константы, когда нам не нужно менять значение. Таким образом, компилятор Swift может сделать некоторые оптимизации и не позволяет нам изменять это значение.

+2

Лучше:' if let ... ', если вам действительно не нужна переменная. –

2

Это потому, что это неявно необязательно не тип String. Вы должны рассматривать это как таковое или разворачивать опцию в своем заявлении println.

var SkinSuffix = NSUserDefaults.standardUserDefaults().stringForKey("SkinSuffix") as! String 

или в println: println(SkinSuffix!)

В качестве примечания, вы должны вы верблюжьего для имен переменных.

+0

Выдает сообщение "Downcast from 'String?" to 'String' только разворачивает опционы, вы хотели использовать '!'? –

+0

Мой ответ был отредактирован. – Aaron

+0

Yah Мне пришлось разворачивать его, так как! String не работает, но все, что мне нужно было сделать, это развернуть его на конец, такой как NSUserDefaults.standardUserDefaults(). stringforKey («SkinSuffix»)! –

0

Вы можете использовать "??" Nil Coalescing Operator, который поможет вам справиться с nil, а также позволяет указать строковое значение по умолчанию.

NSUserDefaults().setObject("_1", forKey: "SkinSuffix") 

let skinSuffix = NSUserDefaults().stringForKey("SkinSuffix") ?? "" 
println(skinSuffix) // "_1" 
Смежные вопросы