web-dev-qa-db-ja.com

Swift NSUserDefaults setString:forKey :?

NSUserDefaultsにはintegerForKey:setInteger:forKey:、およびstringForKey:がありますが、setString:forKey:はありません。

NSUserDefaultsに文字列を設定するにはどうすればよいですか? setObject:forKey:がありますが、Swiftでは、Stringは構造体です。 setObject:forKey:を使用して文字列を保存しても大丈夫ですか?

17
Yoichi Tagaya

setObject を使用して文字列を適用できる理由は、リファレンスの説明に記載されています。

discussion

Swift StringはNSStringにブリッジされているため、setObjectの使用は有効です。ただし、言及されている他のタイプは、setObjectセッターを使用するNSUserDefaultsでは受け入れられません。

convenience-inits

それにも関わらず、ほぼすべての人は、NSObject引数を指定してsetObjectを使用して、シリアル化してNSUserDefaultsに配置することができます(SOの他の箇所で説明)。

12
Tommie C.

更新:Xcode 7.0.1•Swift 2.

let myString = "Hello World"

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

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

Swiftの良いところは、言語を簡単に拡張できることです。独自のsetString(forKey :)、setDate(forKey :)などを作成できます。次のようにNSUserDefaults拡張機能を作成します。

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
19
Leo Dabus

Swift 3が削除されました.setObject。使用する .set代わりに。例えば:

// 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)")
}
16
Daniel Storm

setObject:forKey:NSDictionaryメソッド、またはKVCメソッドであるsetValue:forkey:を明確に使用できます。

それはうまく動作します。

4
Gil Sand