2015-07-03 10 views
8

Sembra esserci uno strano problema con iOS Playgrounds dove NSUserDefaults restituisce sempre nil invece del valore effettivo.NSUserDefaults nel parco giochi iOS

In un parco giochi iOS l'ultima riga restituisce erroneamente nil.

import UIKit 

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("This is a test", forKey: "name") 
let readString = defaults.objectForKey("name") 

In un OSX Playground l'ultima riga restituisce correttamente "Questo è un test".

import Cocoa 

let defaults = NSUserDefaults.standardUserDefaults() 
defaults.setObject("This is a test", forKey: "name") 
let readString = defaults.objectForKey("name") 

Qualche idea del motivo? Bug?

+0

Quale versione di Xcode è in esecuzione, questo funziona per me con Xcode 6.4. – zaph

+0

Entrambi i snippet funzionano anche per me su 6.4 – SomeGuy

risposta

7

Questo non è proprio un bug ..... NSUserDefaults è legato all'ambiente sandbox iOS. Playgrounds non funziona in questo ambiente. Quindi perché non sarai in grado di scrivere file su disco. Se si esegue questo codice nell'applicazione durante l'esecuzione tramite il simulatore o il dispositivo, si avrà accesso all'ambiente sandbox e NSUserDefaults restituirà un riferimento appropriato. Vedo però che ottengo un riferimento appropriato nei campi da gioco e posso impostare e ottenere valori, quindi ci deve essere qualcos'altro che succede qui. Semplicemente non fare affidamento su questo modo di testare questo tipo di funzionalità a causa della natura.

Avviso cosa succede quando sincronizzo il negozio.

Example

Il valore diventa nullo a causa del fatto che non c'è nulla a persistere contro.

+1

Questo funziona per me in un parco giochi iOS: 'let readString = defaults.objectForKey (" name ") as? STRING'. – zaph

+0

Ho aggiornato la mia risposta per riflettere ciò che ho visto in Xcode 6. Solo per curiosità, stai usando la Xcode 7 beta? Non farei mai affidamento sulla funzionalità di lettura/scrittura/archiviazione per funzionare correttamente nell'ambiente del parco giochi. L'ambiente del parco giochi è pensato per un codice modulare più indipendente piuttosto che per il codice di persistenza. – TheCodingArt

1

Il codice funziona correttamente in Xcode 6.4 ma non riesce in Xcode 7.0 beta (7A120f).

  1. I beta sono noti per avere bug.
  2. un bug report: http://bugreport.apple.com
+2

Sembra che questo non funzioni anche nel seme Xcode 7 GM. –

+0

uguale per Xcode 7.1.1 Tuttavia NSKeyedArchiver funziona correttamente –

2

Per quello che vale, il seguente codice funziona bene in iOS giochi la versione 1.6.1 (Swift 4):

import Foundation 

let defaults = UserDefaults.standard 
defaults.set("This is a test", forKey: "name") 
let readString = defaults.string(forKey: "name") 
print(readString!) 

stampe:

This is a test 
0

In Xcode 9.2 per iOS è attualmente funzionante che gli UserDefaults vengano salvati tra repliche del pl ayground. All'inizio questo mi irritava, perché mi aspettavo che dopo ogni interruzione gli UserDefaults fossero puliti, come evidentemente prima. Quindi, un avvertimento: gli UserDefaults sono ora mantenuti tra le repliche, meglio tenerlo a mente quando si cercano i bug, potrebbero esserci degli effetti collaterali!

Problemi correlati