2016-06-13 13 views
29

NSUserDefaults nie wydaje się być klasą w iOS SDK 10:Korzystanie NSUserDefaults z Xcode iOS 8 i 10

let defaults = NSUserDefaults.standardUserDefaults() 

To nie skompilować. Czy ta klasa została usunięta?

(Jest to kanoniczny Q & Para aby zapobiec powodzi zduplikowanych pytań)

Odpowiedz

47

NSUserDefaults została zmieniona na UserDefaults. standardUserDefaults() został przemianowany na standard().

let defaults = UserDefaults.standard 

To teraz działa.

Pre-release documentation link.

+6

Wygląda jak będę mieć trochę zabawy przepisywanie jakąś przeszłość kod. –

+0

@JAL - kiedy dokonamy tych zmian NSUserDefault zgodnie ze Swift 3/ios10/Xcode 8, czy będą aktualne bieżące wartości wszystkich naszych NSUserDefaults? – Joe

+0

@Joe Tak, wszystkie dane będą nadal występować. Są to tylko zmiany nazw klas i funkcji. – JAL

16

@ Odpowiedź JAL jest poprawna, ale może zbyt szczegółowa.

Dużo API został przemianowany w Swift 3. typy Najbardziej Foundation (NSUserDefaults wśród nich) mają obie straciły NS prefiks i miał swoje metody renamed odzwierciedlać Swift 3 API Guidelines. Fundacja również "zastępuje" * grono swoich klas podstawowych typów danych (NSURL, NSIndexPath, NSDate, etc) z Swift-rodzimy value types (URL, IndexPath, Date, etc). Zmiana nazwy metody ma również zastosowanie do wszystkich innych interfejsów API Cocoa/Cocoa Touch używanych w Twojej aplikacji.

Radzenie sobie z tymi problemami jeden po drugim, linia po linii, jest pewnym sposobem na szaleństwo. Pierwszą rzeczą, którą należy zrobić po przeniesieniu projektu do Swift 3, powinno być wybranie z paska menu opcji Edycja> Konwertuj> Do bieżącej składni Swift. Spowoduje to zastosowanie wszystkich zmian naraz, w tym przypadków, w których na jedną linię kodu ma wpływ wiele zmian (a tym samym indywidualne ich adresowanie może nie doprowadzić Cię do miejsca, w którym myślisz, że jedziesz).

* kładę „zastępuje” w cudzysłowie, ponieważ odpowiednie NS zajęcia są nadal wokół przypadków, gdzie można ich potrzebują, ale każdy interfejs API, który je wykorzystuje odnosi się do nowych typów wartości zamiast: na przykład tableView(_:cellForRowAt:) zajmuje teraz IndexPath, a nie NSIndexPath.

+0

Dzięki rickster.Pojawiło się pytanie o meta dotyczące zmiany nazwy klasy w iOS 10 [tutaj] (http://meta.stackoverflow.com/q/326078/2415822). – JAL

20

Aby być bardziej precyzyjne, aby korzystać UserDefaults w Swift-3: -

 //To save the string 
     let userDefaults = UserDefaults.standard 
     userDefaults.set("String", forKey: "Key") 

     //To retrieve from the key 
     let userDefaults = UserDefaults.standard 
     let value = userDefaults.string(forKey: "Key") 
     print(value) 
+5

Nie trzeba pisać 'Foundation' przed' UserDefaults' –