2016-06-13 17 views
29

NSUserDefaults больше не появляется, чтобы быть классом в IOS 10 SDK:Использование NSUserDefaults с Xcode 8 и прошивкой 10

let defaults = NSUserDefaults.standardUserDefaults() 

Это не может скомпилировать. Был ли этот класс удален?

(Это каноническое Q & пара, чтобы предотвратить поток повторяющихся вопросов)

ответ

47

NSUserDefaults был переименован в UserDefaults. standardUserDefaults() был переименован в standard().

let defaults = UserDefaults.standard 

Это сейчас работает.

Pre-release documentation link.

+6

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

+0

@JAL - как только мы сделаем эти изменения NSUserDefault совместимыми с Swift 3/ios10/Xcode 8, текущие значения всех наших NSUserDefault сохраняются? – Joe

+0

@Joe Да, все данные будут продолжать сохраняться. Это просто изменения имени класса и функции. – JAL

16

@ Ответ JAL правильный, но, возможно, слишком конкретный.

Много АФИ получил переименован в Swift 3. Типы Большинство Foundation (NSUserDefaults среди них) оба потеряли свой префикс NS и имели свои методы renamed отразить Swift 3 API Guidelines. Фонд также "заменяет" * куча своих основных классов типов данных (NSURL, NSIndexPath, NSDate и т.д.) с Swift родной value types (URL, IndexPath, Date и т.д.). Переименование метода также применимо к любым другим API-интерфейсам Cocoa/Cocoa Touch, которые вы используете в своем приложении.

Решение этих вопросов по очереди, по строкам, является верным путем к безумию. Первое, что вы делаете при перемещении проекта в Swift 3, должно быть в выборе Edit> Convert> To Current Swift Syntax из строки меню. Это применит все изменения сразу, в том числе случаи, когда одна строка кода зависит от нескольких изменений (и, таким образом, обращение к ним по отдельности может не привести вас туда, где вы думаете, что собираетесь).

* Я помещаю «заменяет» в кавычках, потому что соответствующие классы NS все еще существуют для случаев, когда они вам могут понадобиться, но любой API, который их использует, ссылается на новые типы значений: например. tableView(_:cellForRowAt:) теперь принимает IndexPath, а не NSIndexPath.

+0

Спасибо, rickster.Есть мета-вопрос о переименовании класса в iOS 10 [здесь] (http://meta.stackoverflow.com/q/326078/2415822). – JAL

20

Чтобы быть более точным, чтобы использовать UserDefaults в 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

Не нужно писать 'Foundation.' перед' UserDefaults' –