2015-03-18 17 views
14

NSUserDefaults có integerForKey:, setInteger:forKey:stringForKey:, nhưng không có setString:forKey:.Swift NSUserDefaults setString: forKey :?

Làm cách nào để bạn đặt chuỗi thành NSUserDefaults? Nó có setObject:forKey: nhưng, trong Swift, String là một cấu trúc. Có thể sử dụng setObject:forKey: để lưu trữ chuỗi không?

+0

setObjectForKey –

Trả lời

10

Lý do mà setObject có thể được sử dụng để áp dụng một chuỗi được tìm thấy trong thảo luận về tài liệu tham khảo:

discussion

Từ Swift string là cầu nối để NSString, việc sử dụng setObject là hợp lệ. Tuy nhiên, các kiểu khác được đề cập không được chấp nhận trong NSUserDefaults bằng cách sử dụng setObject setter; họ có những người định cư thuận tiện riêng.

convenience-inits

Mặc dù vậy, hầu hết mọi thứ người ta có thể nghĩ đến có thể được tuần tự và đặt vào NSUserDefaults sử dụng setObject với một cuộc tranh cãi NSData (như đã nói ở đâu đó trên SO).

+0

Cảm ơn câu trả lời của bạn. Các câu trả lời khác là chính xác và được đánh giá cao nhưng tôi lấy câu trả lời này để chấp nhận vì nó đề cập đến cấu trúc Swift String được bắc cầu đến lớp NSString. Việc sử dụng NSData cũng hữu ích. –

4

Bạn chắc chắn có thể sử dụng setObject:forKey:, phương pháp NSDictionary hoặc thậm chí setValue:forkey: là phương thức KVC.

Nó sẽ hoạt động tốt.

17

update: Xcode 7.0.1 • Swift 2,0

let myString = "Hello World" 

NSUserDefaults.standardUserDefaults().setObject(myString, forKey: "myString") 

if let myLoadedString = NSUserDefaults.standardUserDefaults().stringForKey("myString") { 
    print(myLoadedString) // "Hello World" 
} 

Những điều tốt đẹp về Swift là nó cho phép bạn dễ dàng mở rộng ngôn ngữ. Bạn có thể tạo setString của riêng bạn (forKey :), setDate (forKey :), vv ... tạo ra một phần mở rộng NSUserDefaults như sau:

extension NSUserDefaults { 
    func setString(string:String, forKey:String) { 
     setObject(string, forKey: forKey) 
    } 
    func setDate(date:NSDate, forKey:String) { 
     setObject(date, forKey: forKey) 
    } 
    func dateForKey(string:String) -> NSDate? { 
     return objectForKey(string) as? NSDate 
    } 
} 

let name = "Chris Lattner" 
let address = "1 Infinite Loop, Cupertino, CA 95014, United States" 
let dob = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!.dateWithEra(1, year: 1978, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)! 

NSUserDefaults().setString(name, forKey: "userName") 
NSUserDefaults().setString(address, forKey: "userAddress") 
NSUserDefaults().setDate(dob, forKey: "userDOB") 

let loadedUserName = NSUserDefaults.standardUserDefaults().stringForKey("userName") ?? "" 
let loadedUserAddress = NSUserDefaults.standardUserDefaults().stringForKey("userAddress") ?? "" 
let loadedUserDOB = NSUserDefaults.standardUserDefaults().dateForKey("userDOB") ?? NSDate.distantPast() 

print(loadedUserName) // "Chris Lattner" 
print(loadedUserAddress) // "1 Infinite Loop, Cupertino, CA 95014, United States" 
print(loadedUserDOB.descriptionWithLocale(NSLocale(localeIdentifier: "en_US"))) // "Sunday, January 1, 1978 at 12:00:00 
14

Swift 3 đã xóa .setObject. Sử dụng .set để thay thế. Ví dụ:

// Create UserDefaults 
let defaults = UserDefaults.standard 

// Save String value to UserDefaults 
// Using defaults.set(value: Any?, forKey: String) 
defaults.set("Some string you want to save", forKey: "savedString") 

// Get the String from UserDefaults 
if let myString = defaults.string(forKey: "savedString") { 
    print("defaults savedString: \(myString)") 
} 
+2

Ngắn gọn và khách quan. Cảm ơn! –

+1

Điều gì về việc truy xuất giá trị bằng mặc định.string (forKey: "savedString")? Điều đó dường như hoạt động. – RanLearns

+0

@RanTìm hiểu điểm tuyệt vời. Không chắc chắn tại sao tôi đã làm nó như thế ban đầu. Đã chỉnh sửa. –

Các vấn đề liên quan